【问题标题】:merging .dll files with ILMerge failing to work使用 ILMerge 合并 .dll 文件无法正常工作
【发布时间】:2011-06-05 20:30:30
【问题描述】:

首先,我不确定这是否是 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 怎么样?
  • 对于 ILMerge,我像 ilmerge /ndebug /target:winexe /out:test.exe app.exe lib1.dll lib2.dll 一样使用它。

标签: c# dll merge ilmerge


【解决方案1】:

与 D:\C#\source\bin\ReleaseMyApp.exe 关联的 pdb 已过期。

由于您没有明确表示您已检查 pdb 和 exe 是否同步,我想我会问一个明显的问题 - 文件夹中是否有 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 我希望它可以工作,但不,我仍然得到同样的错误。
  • 您是否尝试使用配置文件强制 ilmerge 使用 Framework 4 运行?见research.microsoft.com/en-us/people/mbarnett/…
【解决方案2】:

我希望这种类型的元数据被存储为一个字符串,可能是在显式代码中,但可能是通过属性中的“typeof”。

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

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

【讨论】:

    【解决方案3】:

    试试.NETZ 代替 ILMerge 会有帮助吗?

    【讨论】:

    • 不,因为我试过那个程序,当然,它不起作用。我根据用法使用:netz -s app.exe lib1.dll lib2.dll,但是当我打开打包的.exe时出现一些巨大的错误。删除 -s 没有做任何事情。不确定我是否使用正确,在命令行上使用的正确语法是什么?
    • 我像netz -s -z -w app.exe lib1.dll lib2.dll -so一样使用它
    • 我刚刚尝试了上面的语法,我收到了 2 个警告:!警告:1001 无法处理程序集元数据! !警告:1005 无法处理程序集许可信息!除此之外,我认为一切正常,但启动打包的 .exe 不起作用,并在 MessageBox 中显示一些异常。
    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多