我试图找到从非托管 C++ 代码调用托管 .NET 代码的最佳执行方法。我在我的 C++ 应用程序中找到了有关托管 .NET 的信息,并且我能够创建 pRuntimeHost 并毫无问题地启动它。
ExecuteInDefaultAppDomain 似乎非常有限,因为我真的想向它发送一些参数并让它返回信息结构。最明显的替代方案是使用 COM 方法,但当前的 C# 代码并未真正设置为方法接口。
无论哪种方式,我都想返回整数、字符串 (char *)、双精度数和其他核心 C++ 类型。双方都有太多代码无法将 C++ 转换为 C#,并且使用托管 C++ 不是可接受的解决方案,因为使用此 C++ 代码的其他组出于性能原因不想开始使用托管代码。
目标是尽可能少地修改现有的 C++ 和 C# 代码,但在 C++ 中的特定点仍然使用 C# 代码中的方法,而不会严重影响 C++ 代码的速度。
根据在 Internet 上找到的代码,主机 .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;
}