我正在使用IPC(ROT)和COM互操作。我将尝试在几个方面描述我的问题:
一切正常,直到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!
...
}