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

时间:2014-07-07 14:13:39

标签: 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,它正在运行。

然后我启动另一个.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”...)成功!

感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

感谢 Hans Passant 提示,我可以解决问题。 首先,我使用直接转换(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))
然后根据Hans'评价:

如果COM无法弄清楚如何在整个过程边界编组接口,也会生成E_NOINTERFACE。你忘了注册类型库吗?如果你不使用"注册COM互操作" IDE构建选项然后运行带有/ tlb选项的Regasm.exe

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

感谢您的所有帮助