gpt4 book ai didi

c# - 从非托管代码调用托管 .NET 代码的最佳方式

转载 作者:可可西里 更新时间:2023-11-01 18:29:46 25 4
gpt4 key购买 nike

我试图找到从非托管 C++ 代码调用托管 .NET 代码的最佳性能方法。我在我的 C++ 应用程序中找到了有关托管 .NET 的信息,并且我能够创建 pRuntimeHost 并毫无问题地启动它。

ExecuteInDefaultAppDomain 似乎非常有限,因为我真的想向它发送一些参数并让它返回信息结构。最明显的替代方法是使用 COM 方法,但当前的 C# 代码并未真正设置为方法接口(interface)。

无论哪种方式,我都想返回整数、字符串 (char *)、 double 和其他核心 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;
}

最佳答案

是的,我同意约翰的观点。您真的不想创建运行时的新实例并明确托管它。首先,这背后的管道没有很好的记录,可能会在未来的版本中改变。其次,C++/CLI 旨在以最高效和安全的方式执行此操作。

  1. 编写代表所需 .Net 功能的 native C++ 接口(interface)。

  2. 设置一个支持 CLR 的 dll,它使用非托管类实现 native 接口(interface)。在它们的实现中,您可以创建和访问 CLR 类型并将实例变量存储在 gcroot<T> 中领域。使用 clr 互操作功能在托管/非托管代码、google 或 bing 之间来回编码 marshal_as .

  3. 提供一个(非托管)工厂函数,它创建该组件的一个实例。这 + 非托管 C++ 接口(interface)是您的 native 代码将看到的 API。以与使用非托管 dll 完全相同的方式使用 dll。

关于c# - 从非托管代码调用托管 .NET 代码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8406400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com