ALZ*_*ALZ 3 .net c# windows com interop
我有In-proc(DLL)COM Server,但是我决定以DllSurrogate的身份运行,因此出于以下原因,我从非托管代码(Delphi)获得了:
function TComWrapper.GetServer: IUnknown;
begin
OleCheck(CoCreateInstance(ServerData^.ClassId, nil, CLSCTX_LOCAL_SERVER, IUnknown, Result));
end;
Run Code Online (Sandbox Code Playgroud)
从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);
Run Code Online (Sandbox Code Playgroud)
...
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);
Run Code Online (Sandbox Code Playgroud)
上面的代码不安全。上面是否存在安全版本CoCreateInstance?看来这Activator.CreateInstance对我没有帮助。我必须设置明确运行的上下文(第三个参数)
您也可以这样做:
[ComImport]
[Guid(YourGuidGoesHere)]
private class MyClass
{
}
Run Code Online (Sandbox Code Playgroud)
并像这样创建COM对象的实例:
IYourInterface myClass = (IYourInterface)(new MyClass());
Run Code Online (Sandbox Code Playgroud)
不使用p /调用。