Хостинг CLR: вызвать функцию с произвольной сигнатурой метода?

Мне нужно взять программу на C++, загрузить CLR и вызвать функцию в библиотеке C#. Функция, которую мне нужно вызвать, принимает COM-интерфейс в качестве параметра.

Моя проблема в том, что интерфейс хостинга CLR позволяет вызывать метод только с такой сигнатурой:

int Foo(String arg)

Например, этот код C++ загружает CLR и запускает функцию P.Test в "test.exe":

ICLRRuntimeHost *pClrHost = NULL;
HRESULT hrCorBind = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (PVOID*)&pClrHost);

HRESULT hrStart = pClrHost->Start();

DWORD retVal;
HRESULT hrExecute = pClrHost->ExecuteInDefaultAppDomain(L"C:\\Test.exe", L"P", L"Test", L"", &retVal);

Что мне нужно сделать, так это вызвать функцию с этой сигнатурой метода (обратите внимание, что я владею кодом C#, поэтому я могу его изменить):

void SomeFunction(IFoo interface)

Где IFoo — это com-интерфейс. Я мог бы даже сделать то, что мне нужно, если бы я мог вызвать такую ​​функцию:

IntPtr SomeFunction();

Я мог бы заставить SomeFunction создать правильный делегат, а затем использовать Marshal.GetFunctionPointerForDelegate. Однако я не могу понять, как заставить интерфейсы хостинга делать что-либо, кроме вызова функции с подписью int func (string).

Кто-нибудь знает, как вызвать функцию C# из кода C++ с другой сигнатурой?

(Обратите внимание, что я не могу использовать для этого C++/CLI. Мне нужно использовать API хостинга.)

7
задан svick 7 March 2012 в 00:08
поделиться