我有进程内 (DLL) COM 服务器,但我决定作为 DllSurrogate 运行,出于这个原因,来自非托管代码 (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。

关于c# - .NET 中的 CoCreateInstance 完全匹配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15987491/

10-11 22:13
查看更多