ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-05 12:17:26  阅读:253  来源: 互联网

标签:managed c unmanaged c-2


我正在尝试找到从非托管C代码调用托管.NET代码的最佳性能方法.我在我的C应用程序中找到了有关Hosting .NET的信息,我可以创建一个pRuntimeHost并启动它而不会出现问题.

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

无论哪种方式,我想返回整数,字符串(char *)s,双精度和其他核心C类型.双方都有太多代码将C转换为C#,并且使用Managed 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/C++LI旨在以最有效和最安全的方式完成此任务.

>编写本机C接口,代表所需的.Net功能.
>设置一个支持CLR的dll,它使用umanaged类实现本机接口.在它们的实现中,您可以在gcroot< T>中创建和访问CLR类型并存储实例变量.领域.使用clr互操作功能在托管/非托管代码,google或bing for marshal_as之间来回编组.
>提供(非托管)工厂函数,该函数创建此组件的实例.非托管c接口是您的本机代码将看到的API.使用dll的方式与使用非托管dll完全相同.

标签:managed,c,unmanaged,c-2
来源: https://codeday.me/bug/20191005/1856108.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有