Лучший способ вызвать управляемый код .NET из неуправляемого кода

Я пытаюсь найти наиболее эффективный метод вызова управляемого кода .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;
}
7
задан Andrew Stern 6 December 2011 в 20:29
поделиться