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

4
请稍等!您可能认为这个问题已经被问了无数次,而且已经回答了和地球绕太阳的圈数一样多,但请耐心听我说。
我的任务很简单:在我的C++(Windows)程序中,我想能够执行一些托管的(C#或VB.NET等)代码。
在您按下CTRL-T,从Google中随便找一个链接,然后拍在我脸上,说“学会搜索!”之前,请继续阅读:
我从这里开始: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。

3
你需要自己托管CLR,这样你就可以提供自己的IHostAssemblyManager和IHostAssemblyStore实现。这也使得Giesecke hack变得不必要。 - Hans Passant
完美解决了问题:D 把它作为答案发布,我会标记它。 - user25101622
2个回答

0
你想要创建的是一个“混合模式”程序集。只有在Visual Studio中创建“Managed-C++”程序集/可执行文件才能实现这一点。
根据我的多年经验,C# / VB.NET 不支持此功能。虽然我可能错了,这可能只是Visual Studio而不是C#本身的限制。

0

你在这里尝试的是一些安全方面不太支持的东西。本质上,你正在尝试执行自己的数据块(甚至可能带有nx(不执行)标志)。我过去也尝试过类似的事情(出于DRM原因;仅仅是为了“避免反编译器” - 我不喜欢限制性DRM)。这是可能的,但是使用起来很麻烦,并且取决于目标机器的安全设置而容易出错。如果可能的话,请尽量避免。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接