내 앱이 .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"...) 호출 성공!
감사합니다. 감사합니다.
COM은 .NET Remoting을위한 적절한 대안이 아닙니다. 하나는 Reflection이 작동 할 것으로 예상하는 것과 같은 잘못된 가정을합니다. 인터페이스 캐스트를 실패하게 만들 수있는 많은 것들이 실패합니다. 최소한 (Interop_MyApp.IXXX) r을 사용하십시오. 그러면 절반 정도의 예외가 발생합니다. –
감사합니다. 예외가 발생했습니다 : 추가 정보 : 유형 'System .__ ComObject'의 COM 객체를 인터페이스 유형 'IXXX'로 변환 할 수 없습니다. 다음 오류로 인해 IID '{26E830E0-B0B5-4EAE-85F3-B2364654F47A}'인터페이스의 COM 구성 요소에서 QueryInterface 호출이 실패 했으므로이 작업이 실패했습니다. 해당 인터페이스가 지원되지 않습니다 (HRESULT의 예외 : 0x80004002 (E_NOINTERFACE)). . – Zotyi
새 int 속성 XXX2를 MyApp에 추가하여 111을 반환하고 r2 = t.InvokeMember ("XXX2", BindingFlags.GetProperty | BindingFlags.Public, null, o, null) 호출 객체를 호출했습니다. r2를 111로 설정합니다. 따라서 인터페이스를 얻는 것이 문제입니다. 마샬링 문제 일 수도 있지만 AFAIR은 다른 PC에서 작동했습니다. – Zotyi