旧问题: 我有一个带有IL(.NET)代码的.exe(PE)。 启动时,会调用mscorlib.dll(.NET框架)函数来启动IL代码。 我可以提取.NET代码段并将其附加到其他程序(调用mscorlib.dll来执行该段)吗?
新问题:
我想将已编译的代码从C#.NET程序追加到可以在没有任何.NET运行时的情况下运行的本机纯Win32应用程序,并通过动态调用mscorlib.dll的函数来执行它(如果存在.NET)。这就像一个“可执行的joiner”技术,而不是本机编译。
我不想将一些.NET .exe写入临时目录并执行它;它已经完成,现在想通过直接在我的文件中的.NET代码上调用.NET vm来摆脱temp文件夹(通过给出找到的结构/会话的偏移量,或者只是通过分配正确的PE .section名称 - 知道刚才关于PortableExecutable格式的一点点。)
答案 0 :(得分:1)
您可以在C ++应用程序中托管CLR运行时,然后在托管环境中调用方法
杰夫里希特有例子
答案 1 :(得分:1)
您可以使用随Windows SDK提供的COM API在本机进程内托管CLR。 IIS,SQL Server和其他一些产品就是这么做的。实际上,您可以编写自己的ASP.Net替代品,从理论上处理来自IIS的请求。我没有经验可以分享。请查看以下链接:
http://msdn.microsoft.com/en-us/magazine/cc163567.aspx
http://msdn.microsoft.com/en-us/library/9x0wh2z3%28VS.90%29.aspx
答案 2 :(得分:1)
也许您正在寻找一个链接器,它将接受您的.NET库和引用的程序集,并创建一个可运行的可执行文件或.dll,而无需安装.NET。
两种商业选择是
mono也应该可以。它有一个名为 mkbundle 的实用程序,可以预编译和添加依赖项,但是您需要Cygwin以及更多专业知识才能使其工作。这个问题似乎是一个好的开始:How to convert a simple .Net console project a into portable exe with Mono and mkbundle?。
答案 3 :(得分:0)
虽然VS没有明确支持这一点,但.Net允许您以与.dll程序集相同的方式引用.exe程序集,并调用公共类。
当然,如果您需要调用的代码是私有代码或内部代码,您可能不得不求助于反射以使其工作。
如果您确实需要将代码移动到.dll中,可以尝试ILMerge
创建一个二进制文件。但是,我没有尝试将ILMerge
与引用另一个.exe程序集的程序集一起使用。