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

2023-11-27

我试图找到从非托管 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;
}

是的,我同意约翰的观点。您并不真的想创建运行时的新实例并显式托管它。首先,其背后的管道没有很好的记录,并且可能在未来的版本中发生变化。其次,C++/CLI 旨在以最高效、最安全的方式完成此任务。

  1. 编写代表所需 .Net 功能的本机 C++ 接口。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从非托管代码调用托管 .NET 代码的最佳方法 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • 如何在常规管道作业中触发多分支管道 Jenkins 作业?

    我想触发特定的多分支管道作业 maven 发布 工作流程 测试 特定分支 在常规管道作业中 是否有我需要指定的特殊 build 命令模式 代码片段生成器仅打印 没有这样的工作 maven release workflow test 通过反复
  • 根据元素在另一个已排序列表中的位置对 python 中的列表进行排序

    我想根据预先排序的列表对 Python 中的列表进行排序 presorted list 2C 3C 4C 2D 3D 4D unsorted list 3D 2C 4D 2D 我该如何排序unsorted list使得这些值以相同的顺序出现
  • Angular 6 HTML选择菜单设置默认值

    我习惯了旧的 AngularJS 方式来选择菜单和选择默认值等 但我很难理解如何在 Angular 中执行此操作 6 我有一系列菜单项 fontChoices label Trebuchet value Trebuchet MS Helve
  • Updatepanel 提供完整回发而不是异步回发

    我遇到了一个似乎非常著名的问题 我的 updatepanel 触发完整回发而不是异步回发 正常的解决方案是为所有动态添加的控件提供一个 ID 我已经这样做了 但我仍然得到完整的回发而不是异步回发 这是代码 HTML
  • 如何在 matplotlib 中绘制 3D 旋转图?

    假设您有一条 2D 曲线 例如 from matplotlib import pylab t numpy linspace 1 1 21 z t 2 pylab plot t z 产生 我想进行一场革命来实现 3d 绘图 参见http re
  • 如何在Android项目中使用ThreeTenABP

    我使用的是 Android Studio 2 1 2 我的 Java 设置如下 gt java version gt openjdk version 1 8 0 91 gt OpenJDK Runtime Environment build
  • Linq to Entities 中的动态 where 子句

    我正在使用 linq toEntity EF 我有一个带有 4 个字符串参数的构造函数 根据哪个参数不为空 我必须构建 linq 查询 我可以使用 if else 语句 但我还有其他带有 10 个参数的构造函数 在这种情况下 将会有很多组合
  • 在 SQL Server 上逐字使用 SOUNDEX()

    这是我的问题 例如我有一张桌子Products包含一个字段 Name Products ID Name 1 USB Key 10Go 2 Intel computer 3 12 inches laptop computer 我目前正在为 i
  • C# 中的 FlowDocument 内存问题

    我目前正在尝试解决释放 FlowDocument 资源的问题 我正在加载一个 rtf 文件并使用 TextRange Load 将其放入 FlowDocument 中 我注意到 在执行此操作后 它会保留这些资源 并且 GC 不会收集它 我运
  • 控制台应用程序中的 Twitter OAuth

    是否可以在不访问身份验证网页的情况下对 Twitter 控制台应用程序进行授权 我需要它 因为我正在开发可以从我们公司 Twitter 获取直接消息的应用程序 该控制台应用程序安排在 Web 服务器上 而不是由人类驱动 问候 阿列克谢 扎哈
  • 如何在 nhibernate 中复制和重试死锁

    查看我的日志 我可以看到我的应用程序很容易出现死锁 它们出现在我的应用程序的许多部分 1 有没有办法复制这个问题 即 我只在日志中看到过这一点 2 如果事务被锁定 重试的最佳 最简单方法是什么 3 如果我将调用包装在 try catch 中
  • 如何指定属性必须是(比如说)整数列表,而不仅仅是列表?

    使用属性库和 Python 3 6 我认为以下内容可以让我指定x and y只能包含整数 import attr attr s class C x List int attr ib not working y attr ib type Li
  • 内存目标 BTS 为何会比 load / BTS reg,reg / store 慢得多?

    在一般情况下 可以使用内存或寄存器操作数的指令如何会比内存操作数慢 mov mov gt 指令 gt mov mov 基于发现的吞吐量和延迟Agner Fog 的说明书 以我为例 查看 Skylake p238 我看到以下数字btr bts
  • Resharper 格式化链式方法

    R 中是否有设置将链接方法格式化为从实例化类的相同字符开始 我想要的是 var foo new FooDataBuilder WithDate myDate WithBar myBar Build R 给了我什么 var foo new F
  • 如何在 Windows 中注册自定义 URL 协议?

    如何向 Windows 注册自定义协议 以便在单击电子邮件或网页中的链接时打开我的应用程序并将 URL 中的参数传递给它 Go to Start然后在Find type regedit gt 它应该打开注册表编辑器 Click Right
  • ASP.NET MVC 获取视图的最后修改日期/文件信息

    我需要在工作申请的每一页上注明最后修改日期 我曾经通过在 WebForms 母版页底部包含对 的引用来实现此目的 该引用将返回当前 aspx 页面的上次修改日期 我的代码甚至会检查关联的 aspx cs 文件 比较上次修改日期 并返回最近的
  • .Net枚举winforms字体样式?

    我一直在寻找一种使用 Net 框架列出给定字体的有效字体样式的方法 即使我必须 pinvoke gdi32 或其他一些 API 因为并非所有字体都属于 System Drawing FontStyle 枚举值 粗体 斜体 常规 删除线 下划
  • 自定义WPF窗口样式

    我正在尝试制作自定义窗口样式 目标是创建一个可以被我的应用程序中的每个窗口使用的模板 模板包含工具栏 标题和 窗口将使用的区域 问题是 当我使用我的样式时 我无法再添加网格和控件 App xaml
  • 在 __init__ 上使用 scrapy 管道中的参数

    我有一个 scrapy pipelines py 我想获得给定的参数 在我的 Spider py 中 它工作得非常完美 class MySpider CrawlSpider def init self host domain id args
  • 从非托管代码调用托管 .NET 代码的最佳方法

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