我正在寻找一种最佳的方法,从非托管C++代码中调用托管.NET代码。我已经找到了有关在C++应用程序中托管.NET的信息,并且可以轻松创建pRuntimeHost并启动它。然而,ExecuteInDefaultAppDomain似乎非常有限,因为我想向其发送一些参数并让它返回信息结构体。最明显的替代方案是使用COM方法,但是当前的C#代码没有设置为接口和方法。
无论哪种方式,我都希望返回整数、字符串(char *)、双精度和其他核心C++类型。由于在两端都有太多的代码需要转换C++到C#,使用Managed C++不是一个可接受的解决方案,因为使用此C++代码的其他组不想出于性能原因开始使用Managed code。
目标是尽可能少地修改现有的C++和C#代码,但仍然在C++内特定点使用C#代码中的方法,而不会对C++代码的速度造成重大影响。
根据在互联网上找到的代码,启动和关闭托管.NET的顺序如下:
无论哪种方式,我都希望返回整数、字符串(char *)、双精度和其他核心C++类型。由于在两端都有太多的代码需要转换C++到C#,使用Managed C++不是一个可接受的解决方案,因为使用此C++代码的其他组不想出于性能原因开始使用Managed code。
目标是尽可能少地修改现有的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;
}
msclr::call_in_appdomain
函数族。 - Paul Michalik