InvalidCastException(来自HRESULT的异常:0x80004002(E_NOINTERFACE))而不是COMException

时间:2014-12-03 11:20:52

标签: c# com comexception

我正在使用IPC(ROT)和COM互操作。我将尝试在几个方面描述我的问题:

  • 有两个名为ComServer和ComClient的c#应用程序
  • ComServer创建一个COM互操作对象并将其注册到ROT。只是标记为STAThread的静态Main方法
  • ComClient从ROT获取COM对象并开始远程处理该对象。也作为标记为STAThread的简单静态Main方法。

一切正常,直到COM对象尝试抛出COMException。问题是ComExient抛出InvalidCastException而不是COMException(接口不受支持(来自HRESULT的异常:0x80004002(E_NOINTERFACE))。我知道必须有一些错误的线程模型。两个应用程序作为STA运行,但为什么我得到这个例外?

如果我只是在我的ComClient应用程序中创建COM实例,我得到他正确的COMException。 只有当COM对象从ROT传入时才会得到这个InvalisCastException。

重点:我的COM互操作未注册!我使用并排清单文件和互操作的线程模型是“公寓”。

ComServer:
[STAThread]
static void Main(string[] args)
{
object obj = Activator.CreateInstance(Type.GetTypeFromProgID("MyComApi.MyComClass"));
System.Runtime.InteropServices.ComTypes.IRunningObjectTable pROT = null;
NativeMethods.NativeMethods.GetRunningObjectTable((uint)0, out pROT);
System.Runtime.InteropServices.ComTypes.IMoniker pMoniker = null;
NativeMethods.NativeMethods.CreateFileMoniker("MYCOMCLASS", out pMoniker);
pROT.Register((int)NativeMethods.NativeMethods.ROTFlags.REGISTRATIONKEEPSALIVE,     comObject, pMoniker);
new ManualResetEvent(false).WaitOne();
}

ComClient:
[STAThread]
static void Main(string[] args)
{
MyComApi.MyComClass comobj = (MyComApi.MyComClass)Marshal.BindToMoniker("MYCOMCLASS");
comobj.DoIt();
comobj.DoItWrong(); //<-- InvalidCastException instead of COMException
...
}

ComClient (without getting COM object from ROT:
[STAThread]
static void Main(string[] args)
{
MyComApi.MyComClass comobj = (MyComApi.MyComClass)Activator.CreateInstance(Type.GetTypeFromProgID("MyComApi.MyComClass"));
comobj.DoIt();
comobj.DoItWrong(); //<-- COMException, this is ok!
...
}

0 个答案:

没有答案