无法从通过ROT不同的进程中取得的接口(Cannot get interface from diff

2019-10-30 11:45发布

我的应用程序是一个.exe,自行注册腐烂。

[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.InvokeMember( “XXX” ......)成功!

任何帮助表示赞赏,感谢。

Answer 1:

由于汉斯帕桑特暗示,我可以解决这个问题。 首先,我使用了直接投(Interop_MyApp.IXXX)r以获得更详细的错误:

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编译选项,然后运行Regasm.exe与/ TLB选项是必需的

注册原来的TLB文件后,它的工作就像一个魅力。 做正确的方法是在其中包含接口组件运行Regasm,但是在我的处境没有装配,只有一个纯粹的IDL接口文件,并创建MIDL.EXE类型库。 所以,不知道其他的选择,我用了regtlibv12。

感谢所有帮助



文章来源: Cannot get interface from different process via ROT