.net 将预编译的MSIL文件链接到程序集?

.net 将预编译的MSIL文件链接到程序集?,.net,linker,cil,.net-assembly,.net,Linker,Cil,.net Assembly,是否有任何方法可以预编译MSIL文件,然后让.net链接器在编译时将其链接到.net程序集中 比如说。我有一个项目。我编译它,将它反编译为MSIL,并调整MSIL 现在,我想编译这个经过调整的msil文件并将其链接到另一个项目中 是的,我可以把它作为一个单独的程序集重新编译,然后引用它,但是在这个特殊的例子中,我不能这样做。MSIL的内容需要实际位于目标程序集中 如果可能的话,有什么想法吗?到目前为止,我还没找到任何东西 --编辑-- 一个建议是ILMerge,它可能会起作用。我现在就去拿最新的

是否有任何方法可以预编译MSIL文件,然后让.net链接器在编译时将其链接到.net程序集中

比如说。我有一个项目。我编译它,将它反编译为MSIL,并调整MSIL

现在,我想编译这个经过调整的msil文件并将其链接到另一个项目中

是的,我可以把它作为一个单独的程序集重新编译,然后引用它,但是在这个特殊的例子中,我不能这样做。MSIL的内容需要实际位于目标程序集中

如果可能的话,有什么想法吗?到目前为止,我还没找到任何东西

--编辑-- 一个建议是ILMerge,它可能会起作用。我现在就去拿最新的一本,看看效果如何。我唯一的问题是,在过去,我发现合并后调试很困难(或者至少比不使用ILmerge更困难)。我希望可能会调整proj文件,将编译后的MSIL直接作为构建过程的一部分,以便在IDE中继续轻松调试所有内容

--编辑-- 看来ILMerge不适合这种情况 首先,我得到了这个信息: 合并期间发生异常:(TaskId:32) ILMerge.Merge:程序集“Blah”未标记为仅包含托管代码。(任务编号:32) (考虑使用/zeroPeKind选项——但请先阅读文档!)(TaskId:32) 在ILMerging.ILMerge.Merge()处(任务ID:32) 在ILMerging.ILMerge.Main(字符串[]args)(任务ID:32)

嗯。所以,见鬼,我添加了/zeropekind并重试

没有错误

但是,在这种特殊情况下,合并的DLL在MSIL中有几个函数经过调整,将导出为CDECL函数。在合并的dll中,它们不再导出

老鼠

回到原点。

您可以使用将多个程序集合并为一个,这样您就可以调整msil,使其成为一个单独的程序集,然后将其合并到第一个程序集中

另一种选择是将调整后的MSIL作为嵌入资源加载到第一个程序集中(这意味着必须先创建调整后的MSIL程序集,然后再创建引用它的程序集),然后在运行时将嵌入资源的字节[]读取到加载到AppDomain的程序集中


第三种更激进的方法是反编译两个程序集,并将输出msil文件合并为1,然后将其重建为程序集。您只需注意两组msil代码之间的命名冲突,但由于您可以将msil转储到平面文本文件中,因此编写一些实用程序来重新组合它们应该不会那么困难。。。虽然,这基本上就是ILMerge,但它以2个程序集开始,而不是文本文件中的msil代码…

如前所述,使用ILMerge合并程序集

此外,还可以使用DLLExport实用程序公开标记为CDECL的函数

请参阅以下链接:


是的,我已经拉了ilmerge,打算试试。我希望有一种方法可以调整proj文件,使构建过程本身在构建过程中直接编译和/或链接msil文件。ilmerge的问题是,合并后调试可能会很棘手。您是否尝试过生成后任务?您应该能够使ilmerge.exe以这种方式在每次生成后运行。谢谢。事实上,很有趣,你链接到的是我的博客!