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

时间:2011-10-06 14:45:21

标签: .net linker cil .net-assembly

有没有办法预编译MSIL文件,然后在编译时将.net链接器链接到.net程序集中?

所以,例如。我有一个项目。我编译它,反编译为MSIL,并调整msil。

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

是的,我+ COULD +将其重新编译成一个单独的程序集并引用它,但在这种特殊情况下,我不能这样做。 MSIL的内容实际上需要在目标程序集中。

任何想法,如果这是可能的?到目前为止,我没有找到任何运气。

- 编辑 - 一个建议是ILMerge,它可能有效。我现在将抓住最新的副本,并将看到这些展览会。我唯一的问题是,在过去,我发现在合并后调试很困难(或者至少比我没有使用ILmerge更困难)。我希望可能调整proj文件以直接包含已编译的MSIL作为构建过程的一部分,因此所有内容都将继续在IDE中轻松调试。

- 编辑 - 好吧,看起来ILMerge看起来不适用于这种情况 首先,我收到了这条消息:   合并期间发生异常:(TaskId:32)   ILMerge.Merge:程序集“Blah”未标记为仅包含托管代码。 (TASKID:32)   (考虑使用/ zeroPeKind选项 - 但首先阅读文档!)(TaskId:32)      在ILMerging.ILMerge.Merge()(TaskId:32)      在ILMerging.ILMerge.Main(String [] args)(TaskId:32)

确定。那么,到底是什么,我添加/ zeropekind再试一次。

没有错误!

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

大鼠

回到原点。

2 个答案:

答案 0 :(得分:2)

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

另一个替代方法是将调整后的MSIL作为嵌入式资源加载到第一个程序集中(这意味着必须在引用它之前创建调整后的msil程序集)然后在运行时可以读取byte []将嵌入资源放入程序集中,加载到AppDomain中。

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

答案 1 :(得分:0)

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

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

请参阅以下链接:
http://www.darinhiggins.com/self-registering-com-net-assemblies/
http://www.vbfengshui.com/exposing-c-style-entry-points-in-a-net-assembly-revisited/