【问题标题】:How to execute managed code from unmanaged code?如何从非托管代码执行托管代码?
【发布时间】:2012-03-04 02:27:30
【问题描述】:

坚持下去!你可能认为这个问题已经被问过数百万次了,并且已经回答了地球绕太阳旋转的次数,但请耐心等待我的回答.

我的任务很简单:在我的 C++ (Windows) 程序中,我希望能够执行一些托管(C# 或 VB.NET 等)代码。

等一下! 在你按 CTRL-T 之前,先从 Google 上随机获取一个链接,然后打我的脸,然后说“学习搜索!”,请继续阅读:

我从这里开始http://sites.google.com/site/robertgiesecke/ 这允许我将 C# 函数导出为 C 样式函数,然后在 C++ 中使用它。它工作正常。但现在我有两个二进制文件,native exema​​naged dll

如何将 dll 嵌入 exe 并将其映射到内存中,最后从那里调用它?换句话说,我只想拥有一个包含本机 exe 和托管 dll 的单个 exe。

当然我已经尝试过了http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/
不幸的是,这不起作用,代码最终无法完成“附加”过程。我猜这是因为 dll 的托管形式。

感谢阅读。

编辑:我真的不想使用 C++/CLI :(

【问题讨论】:

  • 您必须自己托管 CLR,这样您才能提供自己的 IHostAssemblyManager 和 IHostAssemblyStore 实现。也使 Giesecke hack 变得不必要。
  • 这完全解决了问题:D 将其发布为答案,我会标记它。

标签: c++ windows dll unmanaged managed


【解决方案1】:

您要创建的是“混合模式”程序集。仅当您在 Visual Studio 中创建“Managed-C++”程序集/可执行文件时才能创建它。

根据我多年的经验,C#/VB.NET 不支持这一点。虽然我可能是错的,它可能只是 Visual Studio 的限制,而不是 C# 本身。

【讨论】:

    【解决方案2】:

    出于安全考虑,您在此处尝试的内容并未得到真正的支持。本质上,您正在尝试执行自己的数据块(甚至可能标有 nx(不执行)标志。我过去尝试过类似的事情(出于 DRM 原因;仅在“避免反编译器”中)-我不是限制性 DRM 的粉丝)。这是可能的,但根据目标机器的安全设置,它是一个 PITA 使用并且容易出错。如果可能的话,不惜一切代价避免它。

    博客上的代码基本上使用了正确的方法,但是该代码仅适用于非托管库(正如您已经注意到的那样)。这仅仅是由于托管库和可执行文件的构建方式(本质上只有一个小的本机存根供可执行文件启动运行时环境;但没有库(因此没有本机入口点;该方法需要)) .

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2013-12-29
      • 2016-06-06
      • 2015-02-24
      相关资源
      最近更新 更多