Interface 无法通过ROT从不同进程获取接口

Interface 无法通过ROT从不同进程获取接口,interface,com,interop,marshalling,Interface,Com,Interop,Marshalling,我的应用程序是一个.exe,它注册为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,它注册为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,它正在运行

然后我启动另一个.exe,它试图获取XXX

        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.InvokeMemberXXX。。。成功

非常感谢您的帮助。

感谢Hans Passant的提示,我可以解决这个问题。 首先,我使用了一个direct cast Interop_MyApp.ixxr来获得一个更详细的错误:

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))
然后根据汉斯的评论:

如果COM无法确定如何跨进程边界封送接口,也会生成E_NOINTERFACE。您忘记注册类型库了吗?如果不使用“注册COM互操作IDE生成”选项,则需要使用/tlb选项运行Regasm.exe

在注册原始tlb文件之后,它就像一个符咒一样工作。 正确的方法是在包含接口的程序集上运行Regasm,但是在我的情况下,没有程序集,只有一个纯idl接口文件和一个由midl.exe创建的类型库。 所以在不知道其他选项的情况下,我使用了regtlibv12


感谢您的帮助

COM不是.NET远程处理的合适选择。首先,你会做出错误的假设,比如期望反射起作用。你可能会做很多错事,使界面转换失败。至少使用Interop_MyApp.ixxr,这样您会得到一个相当不错的异常。谢谢。获取异常:其他信息:无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“IXXX”。此操作失败,因为对IID为“{26E830E0-B0B5-4EAE-85F3-B2364654F47A}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:HRESULT:0x80004002 E_NOINTERFACE不支持此类接口异常。我向MyApp添加了新的int属性XXX2,返回111,调用对象r2=t.InvokeMemberXXX2,BindingFlags.GetProperty | BindingFlags.Public,null,o,null;将r2设置为111。因此,获取接口是个问题。可能是一些封送问题,但AFAIR在其他人的PC上工作。这种接口类型来自哪里?您不能添加对类型库的引用,IDE会抱怨您不应该使用COM,这是正确的。当您忘记[ComImport]和[Guid]属性时,您自己声明它是一个失败的鲸鱼。如果您仍然想坚持使用COM,那么使用dynamic关键字是非常可取的。接口来自tlb文件,由tlbimp导入