2014-07-07 5 views
0

내 앱이 .exe 인 경우 ROT에 등록됩니다.ROT를 통해 다른 프로세스의 인터페이스를 가져올 수 없습니다.

[ComVisible(true)] 
[ProgId("My.App")] 
public class MyApp 
{ 
    public Interop_MyApp.IXXX XXX 
    { 
     get { return XXXImpl.Instance; } // -> Instance is derived from Interop_MyApp.IXXX, and static 
    } 

    public MyApp() { } 
}; 

위의 .exe가 시작되면 실행 중입니다.

그런 다음 XXX를 얻으려는 다른 .exe를 시작합니다.

 object o = Marshal.GetActiveObject("My.App"); // -> returns a __ComObject, fine 
     if (o == null) 
      throw new InvalidOperationException("Could not connect to My.App"); 
     Type t = o.GetType(); 
     object r = t.InvokeMember("XXX", BindingFlags.GetProperty | BindingFlags.Public, null, o, null); //--> returns a __ComObject, fine 
     Interop_MyApp.IXXX xxx = r as Interop_MyApp.IXXX; //----> here xxx is null?! 

내가 t.GetProperties()를 호출하면 0을 반환합니다. "XXX"는 어디에 있습니까? t.InvokeMember ("XXX"...) 호출 성공!

감사합니다. 감사합니다.

+0

COM은 .NET Remoting을위한 적절한 대안이 아닙니다. 하나는 Reflection이 작동 할 것으로 예상하는 것과 같은 잘못된 가정을합니다. 인터페이스 캐스트를 실패하게 만들 수있는 많은 것들이 실패합니다. 최소한 (Interop_MyApp.IXXX) r을 사용하십시오. 그러면 절반 정도의 예외가 발생합니다. –

+0

감사합니다. 예외가 발생했습니다 : 추가 정보 : 유형 'System .__ ComObject'의 COM 객체를 인터페이스 유형 'IXXX'로 변환 할 수 없습니다. 다음 오류로 인해 IID '{26E830E0-B0B5-4EAE-85F3-B2364654F47A}'인터페이스의 COM 구성 요소에서 QueryInterface 호출이 실패 했으므로이 작업이 실패했습니다. 해당 인터페이스가 지원되지 않습니다 (HRESULT의 예외 : 0x80004002 (E_NOINTERFACE)). . – Zotyi

+0

새 int 속성 XXX2를 MyApp에 추가하여 111을 반환하고 r2 = t.InvokeMember ("XXX2", BindingFlags.GetProperty | BindingFlags.Public, null, o, null) 호출 객체를 호출했습니다. r2를 111로 설정합니다. 따라서 인터페이스를 얻는 것이 문제입니다. 마샬링 문제 일 수도 있지만 AFAIR은 다른 PC에서 작동했습니다. – Zotyi

답변

0

감사합니다. 한스 패스 북 힌트 덕분에 문제를 해결할 수있었습니다. 한스 '의견에 따라 다음

Unable to cast COM object of type 'System.__ComObject' to interface type 'IXXX'. 
This operation failed because the QueryInterface call on the COM component for the interface with IID '{26C830E0-B0B5-7EAE-85F3-B23455654F47A}' failed due to the following error: 
No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)) 

: 먼저 나는 더 자세한 오류를 얻기 위해 직접 캐스트 (Interop_MyApp.IXXX)r을 사용 COM은 전역 인터페이스를 마샬링하는 방법을 알아낼 수없는 경우

E_NOINTERFACE도 생성된다 프로세스 경계. 형식 라이브러리를 등록하는 것을 잊었습니까? "COM interop에 등록"IDE 빌드 옵션을 사용하지 않으면 Regasm.exe를/tlb 옵션과 함께 실행해야합니다.

원본 tlb 파일을 등록한 후 매력처럼 작동했습니다. 적절한 방법은 인터페이스가 포함 된 어셈블리의 Regasm을 실행하는 것입니다. 그러나 제 상황에서는 어셈블리가없고 순수한 idl 인터페이스 파일과 midl.exe로 만든 형식 라이브러리 만 있습니다. 다른 옵션을 모르면 regtlibv12를 사용했습니다.

감사합니다.

관련 문제