2013-04-13 2 views
3

я в-прок (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-й параметр)

+0

Нет ничего опасного в отношении правильной декларации пинквака. Обратите внимание, что вам никогда не приходилось использовать ключевое слово * unsafe *. –

+0

@HansPassant, так что обертка 'CoCreateInstance' в' unsafe {...} 'бесполезна? – ALZ

+0

Можете ли вы не просто запустить его как COM-компонент в своем коде? –

ответ

4

Вы также можете сделать это:

[ComImport] 
[Guid(YourGuidGoesHere)] 
private class MyClass 
{ 
} 

и создать экземпляр COM-объекта, как это:

IYourInterface myClass = (IYourInterface)(new MyClass()); 

без использования р/вызов.

+0

Что такое COM после ключевого слова класса? – vkrzv

+0

Это была опечатка. Я обновил свой ответ. –