2017-03-08 18 views
0

내 첫 번째 시도는 실패했지만 가능한 것으로 기대하고 있습니다. 내가 COM이 등록과 같은 클래스가있는 경우 :. NET COMVisible/ComInterop - 등록하지 않고 유형을 사용할 수 있습니까?

[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("53DB4409-0827-471D-94CE-2601D691D04C")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return (ClassLibrary2.Interface1) new ClassLibrary2.Class1(); 
    } 
} 

내가 대해 ComVisible하지만 등록되지 않은 Class2.Interface1를 반환하는 데 사용할 수 있습니다 (이것은 다른 라이브러리에서의) :

[ComVisible(true)] 
public interface Interface1 
{ 
    string SomeMethod(); 
} 


public class Class1:Interface1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("SomeMethod"); 
     return "SomeMethod"; 
    } 
} 

내 첫 번째 시도가 오류를 반환했습니다 : IUnknown : SomeMethod (내 보낸 메서드 없음), 나는 이것을 모르는 일부 트릭이있을 것으로 기대하고 있습니다.

+0

오류 메시지가 잘 보이지 않는 무언가가 클라이언트 코드에 문제가 있습니다. 메서드에서 * object *를 반환하면 클라이언트가 예상 인터페이스 유형의 변형에서 IDispatch 또는 QueryInterface 호출을 통해 "후기 바인딩"을 사용해야합니다. 결코 IUnknown 일 수는 없습니다. 필자는 주조에 대한 현명하지 못한 시도에서 추측 할 수 있는데, 아마도 두 개의 별개의 유형 라이브러리를 가짐으로써 유발 될 수 있습니다. 그냥 짐작할 수 있겠지만 명확하게 질문에 문서화해야합니다. –

답변

0

클래스를 ComVisible (ComVisible만큼 충분하지 않은 인터페이스)으로 표시하면 이것이 가능하다는 것을 알았습니다. 이제 COM을 통해 ClassLibrary3을 사용할 수 있습니다. 코드 아래 참조 : "RegAsm을"에드 아니었다

namespace ClassLibrary1 
{ 
[ComVisible(true)] 
public interface Resolver 
{ 
    object Resolve(string type); 
} 

[ProgId("ClassResolver2")] 
[ClassInterface(ClassInterfaceType.None)] 
[ComVisible(true)] 
[Guid("83720331-12CB-48E1-947C-2413F7B9AB89")] 
public class Class1:Resolver 
{ 
    public object Resolve(string type) 
    { 
     return new ClassLibrary3.Class1(); 
    } 
} 
} 

완전히 별도의 라이브러리 :

namespace ClassLibrary3 
{ 

[ComVisible(true)] 
public class Class1 
{ 
    public string SomeMethod() 
    { 
     MessageBox.Show("ClassLibrary3.Class1.SomeMethod...."); 
     return "ClassLibrary3.Class1.SomeMethod"; 
    } 
} 
}