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

时间:2012-02-12 09:32:32

标签: c++ windows dll unmanaged managed

坚持到那儿!你可能会认为已经有数百万的时间被问过,并且已经回答了地球围绕太阳旋转的那么多时间,但请耐心等待我

我的任务很简单:在我的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 :(

2 个答案:

答案 0 :(得分:0)

您尝试创建的是"混合模式"部件。只有在创建" Managed-C ++" Visual Studio中的汇编/可执行文件。

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

答案 1 :(得分:0)

由于安全问题,您在此尝试的内容并非真正受到支持。基本上你正在尝试执行你自己的数据块(甚至可能用nx(无执行)标记。我过去尝试过类似的东西(出于DRM的原因;只是在“避免反编译器”中 - 我不是限制性DRM的粉丝。。有可能,但根据目标机器的安全设置,它是一个PITA使用和容易出错。如果可能的话,不惜一切代价避免它。

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