合并.dll文件使用ILMerge无法正常工作

4

首先,我不确定这是ILMerge的问题还是其他问题,但我无法将.dll文件合并到我的应用程序中。我尝试在命令行上执行以下操作:

ilmerge /target:winexe /out:test.exe MyApp.exe lib1.dll lib2.dll lib3.dll

我收到了以下错误信息,但我不知道它的含义:

MyApp的元数据中报告了错误。 与D:\C#\source\bin\ReleaseMyApp.exe相关联的pdb已过时。

顺便说一下,我正在使用最新版本(2.10.526.0),但是我无法让它正常工作,我真的需要帮助。上述错误是什么意思,我该如何修复它?


实际上有PDB文件吗?在调用“ilmerge”之前,编译为发布版本并删除任何PDB文件如何? - Uwe Keim
3
我使用ILMerge的命令是 ilmerge /ndebug /target:winexe /out:test.exe app.exe lib1.dll lib2.dll - Uwe Keim
3个回答

5
与D:\C#\source\bin\ReleaseMyApp.exe相关联的pdb已过期。 由于您并没有明确表示您已检查过pdb和exes是否同步,所以我猜我会问一个显而易见的问题-文件夹中是否有pdb并且您是否已经检查了文件的时间戳? 据我所知,如果源文件可用调试信息,则ilmerge将为目标创建调试信息,如果原始文件已过期,则可能显示此错误而不是生成错误的信息。 如果您不需要调试信息,如果删除pdb文件会发生什么?

pdb文件已经是最新的了,我只是在构建成功后将它们复制了一份。当我删除它时,似乎也可以工作,尽管不足为奇,我收到了另一个错误,太棒了。“不允许未解决的程序集引用:Microsoft.mshtml...”所以经过一番搜索,我意识到需要指定.NET Framework版本4的路径。于是我这样做:ilmerge /targetplatform:v4,C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319 /out:test.exe MyApp.exe lib1.dll lib2.dll lib3.dll我本来期望它能够工作,但是没有,我仍然得到相同的错误。 - Iceyoshi
你尝试使用配置文件强制ilmerge使用Framework 4运行了吗?请参阅http://research.microsoft.com/en-us/people/mbarnett/ilmerge-40-exe-config.aspx。 - sgmoore

0

我预计这种类型的元数据被存储为字符串,可能是通过显式代码,也可能是通过属性中的 "typeof"。

您可以尝试处理AppDomain的TypeResolve事件,检测失败的类型字符串并返回您想要的类型 - 这应该可以解决它现在位于不同程序集的问题。

http://msdn.microsoft.com/en-us/library/system.appdomain.typeresolve.aspx


0

尝试使用.NETZ而不是ILMerge会有帮助吗?


1
不行,因为我尝试了那个程序,当然它不起作用。 我使用了:netz -s app.exe lib1.dll lib2.dll,按照使用方法,但是当我打开打包的.exe文件时,出现了一些巨大的错误。去掉-s也没有任何作用。 不确定我是否使用正确,命令行应该使用什么正确的语法? - Iceyoshi
我使用它的方式是 netz -s -z -w app.exe lib1.dll lib2.dll -so - Uwe Keim
我刚试了上述语法,结果收到2个警告: ! 警告:1001 无法处理程序集元数据! ! 警告:1005 无法处理程序集许可信息!除此之外,我认为一切都很顺利,但启动打包的.exe文件无法运行,并在MessageBox中显示一些异常信息。 - Iceyoshi

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