无法加载文件或程序集...或其某个依赖项。尝试加载格式不正确的程序(.resx文件)。

37

我在Windows 7 64位操作系统下编译或运行应用程序时,遇到了以下错误消息。我已经搜遍了互联网,很多人都有同样的错误信息。然而,没有任何解决方案能够解决我的问题或情况。我正在使用Visual Studio 2010

错误消息

错误38:无法加载文件或程序集“file:///D:/Projects/Windows Projects/Weld/Components/FileAttachments/FileAttachments/FileAttachments/bin/x86/Debug/FileAttaching.dll”或其中一个依赖项。尝试加载格式不正确的程序。位置:第1212行,第5个字符。D:\Projects\Windows Projects\Weld\Weld\Weld.UI\frmMain.resx 1212 5 Weld.UI

描述

好的,我有两个项目,一个是UI项目,一个是FileAttachment项目。UI项目引用了FileAttachment项目。当我以“任何CPU”模式编译UI项目时,一切正常,并且它可以运行。我假设在编译时,“任何CPU”将以64位模式运行,因为这是我所使用的平台。

我想以x86模式运行/编译,所以我尝试这样做。我将所有项目的配置更改为x86,并验证这些配置正在编译为x86。我编译后,出现了如上所述的错误。

我觉得很奇怪,它在64位下编译和运行正常,但在32位下却不行。然而,当以“任何CPU”编译并部署到使用x86的用户时,他们仍然可以正常使用,没有任何问题。只是我不能以x86模式编译或运行我的PC。同样地,我可以以“任何CPU”编译并在32位PC上部署而没有任何问题。

两个项目都没有引用任何仅限于64位的DLL文件。已经验证这两个项目的目标是32位DLL文件和.NET框架程序集。

我需要在32位模式下本地编译并运行此应用程序。我需要JIT编辑/继续等功能。

以下是导致问题的resx文件中的代码行:

 <data name="ImageList1.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
....{mime data}....
 </data>

该resx文件已验证生成为.NET 2.0版本,仅引用.NET 2.0的程序集而非.NET 4.0版本。

我该如何解决这个问题?我已在互联网上搜索了许多人遇到了相同的错误提示,但问题却不同。


1
现在已经过去2年了。现在有更好的处理这个问题的方法吗?VS 2010更新或其他什么东西?我们刚刚升级到VS 2010,但仍然遇到同样的问题。 - goku_da_master
4个回答

34

这似乎是一个与图像列表相关的VS 2010错误。请参见https://connect.microsoft.com/VisualStudio/feedback/details/532584/error-when-compiling-resx-file-seems-related-to-beta2-bug-5252020?wa=wsignin1.0

我能够使用列出的解决方法使其正常工作。


发布者Luis Mack在5/12/2010上午8:50发布了相同问题,只是特定项目在64位机器上编译时出现。一种看起来有效的解决方法是每次在设计器中编辑用户控件或表单时手动更改图像流中的一个字符。

          AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w

更改为      AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w

即将行末的00LjAuMC4w改回0yLjAuMC4w(00变成0y)


Jim


1
谢谢你的提示。那么,当您更改一个字符时,设计师会进行更正,以便您不会得到损坏的 MIME 图像流? - Dan
3
请参阅此Visual Studio博客文章,其中包含推荐的解决方法:http://blogs.msdn.com/b/visualstudio/archive/2010/06/19/resgen-exe-error-an-attempt-was-made-to-load-a-program-with-an-incorrect-format.aspx 我们选择了解决方法2、选项3,并且似乎对我们的需求有效。 - Rory
1
到目前为止,我已经不得不使用这个解决方案大约5次了,(00回到0y)每次都能解决我的问题。 - user153923
2
谢谢 - 这让我疯了! - Shaul Behr
6
建议编辑将 "System.Windows.Forms, Version 4.0.0.0" 更改为 "System.Windows.Forms, Version 2.0.0.0"。 - Hans Passant
显示剩余2条评论

8

我的最简单的解决方案是进入出错的行,将base64更改为base32

<data name="myGUIcontrol.myObj" mimetype="application/x-microsoft.net.object.binary.base32">
... block of binary here

但我希望找到一种方法,使得每次在设计师中进行更改时不会出现这种情况。也许可以为类添加一个属性,强制VS10将其转换为base32?


5
您的修复使项目可以再次编译,但我认为您是通过吞噬错误来进行修复的。例如,您可以将“base64”更改为“base4”,这并不重要。 - Yoopergeek
1
我也想到这个,而且它“起作用”了。但是正如Yoopergeek所说,这似乎是一个“被吞噬的错误”。嗯。 - EleventhDoctor

2
我遇到了一个类似的问题,与我的一个程序有关。问题在于,由于某种原因,Visual Studio似乎会为一些GUI控件属性生成64位数据块,而在编译为x86时无法加载这些数据块。
在我的情况下,我能够通过从resx文件中删除有问题的数据块以及在cs.designer文件中引用那些块的代码行来解决问题。我之所以能够这样做,是因为分配被引用属性的相应源代码行是多余且不必要的。唯一让人烦恼的是,每次我修改设计师中的任何内容时,都需要重新修复这些问题,因为Visual Studio会再次添加错误的代码。

1
感谢您的回复。我已经找到其他帖子,人们也遇到了类似的问题。这绝对是VS2010中的一个错误,浪费了我数小时的时间:( - Dan
1
我刚刚将我的Visual Studio 2010项目从.NET 2.0升级到.NET 4.0,现在不再出现错误,并且能够以x86模式运行该项目并进行完整的调试。这一定是.NET 2.0的问题。但问题是,我们的客户端PC尚未升级到.NET 4.0 :( - Dan
1
感谢您提供了关于用户控件属性的相关信息。我也遇到了同样的问题,即VS将序列化由我的用户控件发出的属性,但在编译时,我会收到“无法加载文件或程序集...或其某个依赖项”的错误提示。然而,您的“修复”方法很麻烦,因为每次打开设计器时都必须执行它,并且其次,它不允许我通过设计器保留对属性所做的任何修改。我正在考虑采用@Dan的方法,将我们的项目转向.NET 4,因为这非常令人恼火。 - Yoopergeek

2

上周我们遇到了同样的问题,但是我们找到了一个好的解决方法。

你需要在设计器中打开.resx文件,并将访问修饰符从public改为no code generation。


当我在设计器中打开文件时,访问修饰符似乎无法更改。 - EleventhDoctor

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