Я пытаюсь найти наиболее эффективный метод вызова управляемого кода .NET из неуправляемого кода C ++.Я нашел информацию о Hosting .NET в своем приложении C ++, и я могу создать pRuntimeHost и запустить его без проблем.
ExecuteInDefaultAppDomain кажется очень ограниченным, поскольку я действительно хочу отправить ему несколько параметров, и он вернет структуру информации. Наиболее очевидной альтернативой является использование методов COM, но текущий код C # на самом деле не настроен как интерфейсы с методами.
В любом случае я хочу возвращать целые числа, строки (char *), числа типа double и другие основные типы C ++. С обеих сторон слишком много кода для преобразования C ++ в C #, и использование управляемого C ++ не является приемлемым решением, поскольку другие группы, использующие этот код C ++, не хотят начинать использовать управляемый код из соображений производительности.
Цель состоит в том, чтобы как можно меньше модифицировать существующий код C ++ и C #, но при этом использовать методы в коде C # в определенных точках внутри C ++ без значительного влияния на скорость кода C ++.
На основе кода, найденного в Интернете, последовательность запуска и завершения работы хоста .NET:
#include "stdafx.h"
#include <metahost.h>
#pragma comment(lib, "mscoree.lib")
int _tmain(int argc, _TCHAR* argv[])
{
ICLRMetaHost *pMetaHost = NULL;
ICLRMetaHostPolicy *pMetaHostPolicy = NULL;
ICLRDebugging *pCLRDebugging = NULL;
HRESULT hr;
hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID*)&pMetaHost);
hr = CLRCreateInstance(CLSID_CLRMetaHostPolicy, IID_ICLRMetaHostPolicy, (LPVOID*)&pMetaHostPolicy);
hr = CLRCreateInstance(CLSID_CLRDebugging, IID_ICLRDebugging, (LPVOID*)&pCLRDebugging);
DWORD dwVersion = 0;
DWORD dwImageVersion = 0;
ICLRRuntimeInfo *pRuntimeInfo;
hr = pMetaHost->GetRuntime(L"v4.0.30319", IID_ICLRRuntimeInfo, (LPVOID *)&pRuntimeInfo);
ICLRRuntimeHost * pRuntimeHost = NULL;
hr = pRuntimeInfo->GetInterface(CLSID_CLRRuntimeHost, IID_ICLRRuntimeHost, (LPVOID *)&pRuntimeHost);
hr = pRuntimeHost->Start();
DWORD dwRetCode = 0;
//hr = pRuntimeHost->ExecuteInDefaultAppDomain(argv[1], L"MyNamespace.MyClass", L"Message", L"Hello World!", &dwRetCode);
// Stop the CLR runtime and shutdown cleanly.
hr = pRuntimeHost->Stop();
hr = pRuntimeHost->Release();
hr = pRuntimeInfo->Release();
hr = pCLRDebugging->Release();
hr = pMetaHostPolicy->Release();
hr = pMetaHost->Release();
return 0;
}