我有进程(DLL)的COM服务器,但我解决了作为DllSurrogate运行,由于这个原因从非托pipe代码(delphi)我有:
function TComWrapper.GetServer: IUnknown; begin OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result)); end;
从C#使用现在:
[DllImport("ole32.dll", EntryPoint = "CoCreateInstance", CallingConvention = CallingConvention.StdCall)] static extern UInt32 CoCreateInstance([In, MarshalAs(UnmanagedType.LPStruct)] Guid rclsid, IntPtr pUnkOuter, UInt32 dwClsContext, [In, MarshalAs(UnmanagedType.LPStruct)] Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object rReturnedComObject);
…
UInt32 dwRes = CoCreateInstance(ClassIdGuid, IntPtr.Zero, (uint)(CLSCTX.CLSCTX_LOCAL_SERVER), //if OR with CLSCTX_INPROC_SERVER then INPROC Server will be created, because of DLL COM Server IUnknownGuid, out instance);
上面的代码是不安全的。 CoCreateInstance
上面是否存在安全版本? 看来, Activator.CreateInstance
不帮助我。 我必须显式设置运行上下文(第三个参数)
你也可以这样做:
[ComImport] [Guid(YourGuidGoesHere)] private class MyClass { }
并像这样创建一个COM对象的实例:
IYourInterface myClass = (IYourInterface)(new MyClass());
不使用p / invoke。