я в-прок (DLL) COM-сервера, но я поселился в бежать как DllSurrogate, по этой причине из неуправляемого кода (Delphi) у меня есть:Точное совпадение CoCreateInstance в .NET?
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
мне не помогает. Я должен установить явно текущий контекст (3-й параметр)
Нет ничего опасного в отношении правильной декларации пинквака. Обратите внимание, что вам никогда не приходилось использовать ключевое слово * unsafe *. –
@HansPassant, так что обертка 'CoCreateInstance' в' unsafe {...} 'бесполезна? – ALZ
Можете ли вы не просто запустить его как COM-компонент в своем коде? –