【问题标题】:Are there size limitations to the .NET Assembly format?.NET 程序集格式有大小限制吗?
【发布时间】:2010-11-30 12:44:37
【问题描述】:

我们遇到了一个我以前从未遇到过的有趣问题。我们在 Visual Studio 2008 SP1 中有一个大规模生产的 ASP.NET 3.5 SP1 Web 应用程序项目,它使用网站部署项目进行编译和部署。去年一切正常,直到昨天签入后,该应用程序开始严重失败,并显示 BadImageFormatException

有问题的签入并没有改变任何特别的地方,错误来自应用程序的甚至没有改变的区域。使用 Reflector 我们检查了有问题的方法,发现代码中有垃圾字符串 (which .NET Reflector humorously interpreted as Chinese characters)。我们一直在多台机器上重现此问题,因此它似乎与硬件无关。

进一步检查表明,在部署期间用作aspnet_merge.exe 输入的程序集中存在这些垃圾字符串。

aspnet_merge.exe / Web 部署项目输出 程序集属性:

  • 将所有输出合并到一个程序集中
  • 将每个单独的文件夹输出合并到自己的程序集中
  • 将所有页面和控制输出合并到一个程序集中
  • 为每个页面创建单独的程序集并控制输出

在 web 部署项目属性中,如果我们将合并选项设置为第一个选项(“将所有输出合并到单个程序集”),我们会遇到问题,但 所有 其他选项都可以正常工作!

我的问题:有人知道为什么会这样吗? aspnet_merge.exe 的功能是否有大小限制(生成的合并 DLL 约为 19.3 MB)?合并 WAP 的输出是否还有其他已知问题?

如果任何汇编格式/aspnet_merge.exe 专家知道这样的限制,我会很高兴的。在我看来,就像一个 25MB 的程序集,虽然很大,但并不离谱。

【问题讨论】:

  • 你能修复图像,还是删除链接?

标签: asp.net assemblies ilmerge badimageformatexception aspnet-merge


【解决方案1】:

您可以尝试在其上运行PEVerify 看看您会得到什么。

对我来说,这听起来像是一个编码问题……但我不确定为什么会发生这种情况。从技术上讲,可以放入程序集中元数据表的元数据数量是有限的,但我怀疑这是否是问题所在。

如果您在Ildasm 中打开 exe,您可以看到元数据表的大小,您可以尝试查看统计信息(查看->统计)或元数据表的计数,这是一个 2 步过程:1 . View->Metainfo->Raw:Count,Sizes 2. 按Ctrl+M

【讨论】:

  • 感谢您的工具。我将不得不尝试这些并报告它发现了什么。当我使用Reflector查看有问题的方法时(见上面的截图),很清楚哪里组装不正确。 PEVerify 会告诉我哪里不正确,还是他们也能说出为什么
  • 如果我没记错的话(我使用它已经有一段时间了),是的,它会指出它在元数据中发现了哪些错误。但是,您可能需要在 ildasm 中打开它以翻译错误消息中将提到的某些内容,例如令牌。 PEVerify 也是一个非常原始的工具 - 这意味着它不是为日常开发人员设计的,您可能需要在谷歌上搜索一些错误消息才能看到它在说什么。
【解决方案2】:

当您尝试在 x86 上运行 x64 代码时,不会抛出 BadImageFormatException 吗?

【讨论】:

  • 这是发生这种情况的一种情况 (msdn.microsoft.com/en-us/library/…),但在这种情况下并非如此。各个程序集本身可以正常工作,但一旦合并就会失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多