【发布时间】:2013-04-13 11:51:51
【问题描述】:
我有进程内 (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 对我没有帮助。我必须明确设置运行上下文(第三个参数)
【问题讨论】:
-
正确的 pinvoke 声明没有什么不安全的。请注意,您永远不必在任何地方使用 unsafe 关键字。
-
@HansPassant,所以将
CoCreateInstance包裹在unsafe{...}中是没有用的? -
你不能在你的代码中把它作为一个 COM 组件运行吗?
-
@ALZ 是的。
unsafe块基本上是用于不安全的指针操作,你什么也没做。
标签: c# .net windows com interop