2017-03-27 13 views
0

VBA에서 사용하기 위해 클래스 라이브러리를 생성하는 데 어려움을 겪고 있습니다. 프로젝트에 한 클래스를 가져 왔지만 두 번째 클래스는 등록되지 않은 것으로 보입니다. VBS를 사용하여 테스트하는 경우 CreateObject ("Libname.Class2")가 작동하지만 CreateObject ("Libname.Class1")는 "ActiveX 구성 요소가 개체를 만들 수 없습니다."라는 오류를 제공합니다. RegAsm은 유용한 피드백을 제공하지 않고 있습니다. 단지 일부 유형이 수출되었지만 다른 유형이 아닌 이유를 말해주지는 않습니다. Class2는 OleView에서만 찾을 수 있습니다.어셈블리의 일부 클래스는 COM에는 노출되지만 다른 요소에는 노출되지 않는 이유는 무엇입니까?

이런 종류의 오류와 관련된 대부분의 대답은 RegAsm의 잘못된 버전 (x86/x64)이 사용 된 경우를 나타내지 만 한 클래스가 성공적으로 등록되면이 사실을 상상할 수 없습니다. 그 경우입니다 (어쨌든 두 버전 모두에 등록하고 있습니다). 기본 생성자에 포함 된 것이 있는지 확인하도록 제안 된 답변도 있었지만 최적화되지는 않았지만 도움이되지 않았습니다.

은 (떨어져 PROGID에서) 동일한 특성을 가지고 있고, 상대적으로 비슷한 인터페이스를 가지고

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface _Class1 
{ 
    _Class2 GetClass2(); 

    string testertong { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class1")] 
[ComVisible(true)] 
class Class1 : _Class1 
{ 
    private ...; 

    public Class1() 
    { 
     /* Constructor stuff - commenting it out doesn't help */ 
    } 

    public _Class2 GetClass2() 
    { 
     /* Generate and return an instance of Class2. Tried return null too */ 
    } 

    public string testertong 
    { 
     get 
     { 
      return "I love yams"; 
     } 
    } 
} 

Class2의 실제로 내가 만든 그 두의 첫 번째

[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[ComVisible(true)] 
public interface _Class2 
{ 
    ArrayList GetLog(int entries); 

    string testytest { get; } 
} 

[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class2")] 
[ComVisible(true)] 
public class Class2 : _Class2 
{ 
    internal IThing client; 

    public Class2() 
    { 
     /* Currently empty but works fine */ 
    } 

    public ArrayList GetSubmissionLog(int entries) 
    { 
     return new ArrayList(client.GetSubmissionLog(entries)); 
    } 

    public string testytest 
    { 
     get { return "wololo"; } 
    } 
} 
과 컴파일. Class1은 실제로 WCF 설정을 수행하는 Factory 객체가 될 것입니다. 이전에 등록 된 어셈블리에 클래스를 추가하는 것이 문제를 일으키는 지 알 수 없습니다 (그렇다면 어떻게 수정합니까?).

다음 VBS는 예상대로 작동합니다

Set y = CreateObject("Libname.Class2") 
Msgbox y.testytest 

어떤 도움이 많이가 표시 수준을 지정하지 않기 때문에

답변

0

Class1 암시 internal입니다 감사합니다. ComVisibleAttribute에서

이 설명되어 있습니다
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Libname.Class1")] 
[ComVisible(true)] 
public class Class1 : _Class1 
{ 

변경 그것은 :

만 공공 유형 표시 할 수있다. 그렇지 않은 경우 내부 또는 보호 된 형식을 COM에 표시하거나 보이지 않는 형식의 멤버를 표시 할 수 없도록 특성을 사용할 수 없습니다.

+0

글쎄, 그건 내가 놓친 꽤 바보 같았 어. 고맙습니다! – user2782092