如何从非托管代码执行托管代码

How to execute managed code from unmanaged code?

本文关键字:执行 托管代码 非托管代码      更新时间:2023-10-16

抓住它你可能认为这个问题已经被问了数百万次,而且已经被回答了地球绕太阳旋转的次数,但请耐心听我说。

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

等等在你使用CTRL-T之前,先从谷歌上随机获取一个链接,然后打在我脸上,然后说"学会搜索!",请继续阅读:

我从这里开始http://sites.google.com/site/robertgiesecke/这允许我将C#函数导出为C风格的函数,然后在C++中使用它。它工作正常。但现在我有两个二进制文件,本机exe托管dll

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

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

感谢阅读。

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

您试图创建的是一个"混合模式"程序集。只有在Visual Studio中创建"Managed-C++"程序集/可执行文件时,才能创建此程序集。

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

由于安全问题,您在这里尝试的内容并没有得到真正的支持。从本质上讲,您正在尝试执行自己的数据块(甚至可能标记有nx(无执行)标志)。我过去也尝试过类似的东西(出于DRM的原因;只是在"避免反编译器"中——我不喜欢限制性DRM)。这是可能的,但它是一个PITA,根据目标机器的安全设置,它很容易出错。如果可能的话,不惜一切代价避免它。

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