使用新的 .net dll 更新应用程序时出现了 FileLoadException 错误?

5
我有一个使用 .net 3.5 的应用程序,其中包含许多dll文件。我试图仅重新构建特定的dll而无需构建整个应用程序,但在将旧的dll替换为新的dll后,应用程序抛出异常,因为它无法加载新的dll。 异常信息: System.IO.FileLoadException:无法加载文件或程序集...... 我了解它会搜索特定版本和公共标记的程序集,如何在不重新构建应用程序的情况下解决此问题?另外,该应用程序已签名但未在GAC中注册。 P.S: 如何跳过再次构建应用程序,或者说这是必须的,因为dll已经被重新构建了?

1
确保新程序集具有相同的名称和相同的[AssemblyVersion]。签名是一个错误。.NET 3.5 SP1在完全信任模式下不检查签名。 - Hans Passant
你是如何更新汇编代码的? - Sharique
我假设你确定新构建是针对 .Net 3.5 的 :) --- 你可以始终检查 LoaderExceptions 来获取更多信息:var reflection = ex as ReflectionTypeLoadException; - Eben Roux
我只是在 DLL 中更改了一点内容,然后重新构建并用新的替换了旧的。 - Ahmed
你是否在每次构建中自动递增版本号?如果是,请禁用此功能并重试 - 最坏的情况下,在它正常工作后手动更新版本号。 - Shadow The Spring Wizard
显示剩余2条评论
5个回答

5
你遇到错误的原因是因为你的程序集已经签名,并且很可能你对它的引用设置了Specific Version属性为True,而你所做的更改所在的程序集版本号已发生变化。我尝试了许多情况,只有这种情况会导致FileLoadException异常。如果你将目标框架更改为较新的版本(如4.0),则会出现BadImageFormatException异常。即使你说你没有更改版本号,请仍然检查一下,或者通过选择你的引用,右键单击并选择属性,将Specific Version设置为False。

你的异常可能看起来像这样:

Could not load file or assembly 'LoadedAssembly, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=889080b75eb3bad2' or one of its dependencies. The located assembly's manifest
definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

但是,如果被引用的程序集不再是1.0.0.0版本(或者其他版本),那么您编译的版本就会出现问题。在下面的图像中(虽然很小),您可以看到引用属性正在寻找1.0.0.0版本,特定版本设置为True,并且参考程序集已签名,实际上是2.0.0.0版本,因此导致FileLoadException错误。
通过将版本号更改回来并重新编译,或者将特定版本设置为False并仅重新构建该DLL来解决此问题。您不必重建整个应用程序。

2
您尝试过使用 DEVPATH 环境变量吗?此环境变量允许您定义一个目录,作为“开发期间的GAC”。您需要做的就是:

1)将以下元素添加到machine.config文件中(请仔细检查要使用的machine.config位置)

  • C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG 或者
  • C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG *

2)添加一个名为DEVPATH的新环境变量

set devpath="e:\temp\Message_DLL\bin\Debug"     /// manually, console
/// or open windows config form - see below

设置DEVPATH环境变量

3) 然后进入您的UI应用程序/项目,并将引用添加到DEVPATH目录中的dll中。

添加dll引用

确保您配置了 "local copy = false, specific version = false"。正如您所看到的,强名称 (Starker Name)true

4) 现在您需要编译您的UI应用程序一次!之后,您可以根据自己的想法更改DLL中的源代码。由于DEVPATH变量,您的UI应用程序将始终选择最新版本的DLL!

注意! 我尝试从VS启动UI应用程序,但出现了加载异常。但是从资源管理器窗口启动它 - 成功了。似乎从VS启动UI应用程序会导致CLR在其他地方查找所需的DLL。


您还可以参考MSDNMSDN2

备注: 仅在开发时使用此设置。运行时不会检查 DEVPATH 中找到的强名称程序集版本。它只是使用它找到的第一个程序集。

您还可以参考以下文章/网页。

CodeProject - 程序集位置、绑定、部署

关于DEVPATH的社交MSDN问题

我认为这应该能解决问题!


0

你应该重新构建那些引用了这个新dll的程序集。


0
Windows事件日志应该提供更多关于未能加载的信息。您是否在新的DLL中引入了另一个依赖项?我曾经遇到过类似的情况,其中第三方DLL需要安装C++ Runtime 2005(这在大多数开发机器和大多数台式机上都是常见的情况)。

没有使用本地 DLL,所有组件都是 .NET 3.5。 - Ahmed

0

猜测一下...您能否检查包含DLL的文件夹是否被标记为只读。

右键单击文件夹 > 属性 > 取消选中只读 > 点击应用 > 选择所有子文件夹和文件 > 确定。

重新构建您的解决方案。


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