Я пытаюсь найти наиболее эффективный метод вызова управляемого кода .NET из неуправляемого кода C ++.Я нашел информацию о хостинге .NET в своем приложении C ++, и я могу создать pRuntimeHost и запустить его без проблем.
ExecuteInDefaultAppDomain кажется очень ограниченным, так как я действительно хочу отправить ему несколько параметров ипусть он вернет структуру информации.Наиболее очевидной альтернативой является использование COM-методов, но текущий код C # на самом деле не настроен как интерфейс с методами.
В любом случае я хочу вернуть целые числа, строки (char *) s, double и другое ядро C ++.типы.С обеих сторон слишком много кода для преобразования C ++ в C #, и использование Managed C ++ не является приемлемым решением, поскольку другие группы, использующие этот код C ++, не хотят начинать использовать Managed-код по соображениям производительности.
Цель состоит в том, чтобы как можно меньше изменить существующий код 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;
}