Мне нужно взять программу на 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 хостинга.)