我的应用程序是.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”...)成功!
感谢任何帮助,谢谢。
答案 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。
感谢您的所有帮助