5

我有一个带有许多 dll 的 .net 3.5 应用程序,我尝试在不构建整个应用程序的情况下重建特定的 dll,但是在用新的替换旧的后,应用程序抛出异常,因为它无法加载新的 dll 异常:System.IO .FileLoadException: 无法加载文件或程序集....我知道它会搜索具有特定版本和公共令牌的程序集,如何在不重新构建应用程序的情况下解决此问题?该应用程序也已签名但未在 GAC 中注册。PS:我怎样才能跳过再次构建应用程序,或者它是重新构建dll时必须的?

4

5 回答 5

5

您收到错误的原因是因为您的程序集已签名,并且您对它的引用很可能将特定版本属性设置为 True,并且您进行更改的程序集的版本号已更改。我尝试了很多场景,这是我能够获得 FileLoadException 的唯一场景。如果您已将 Target Framework 更改为较新的版本(如 4.0),则会收到 BadImageFormatException。即使您说您没有更改版本号,仍然要检查它,或者通过选择您的参考将特定版本设置为 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 来解决此问题。您不必重建整个应用程序。

在此处输入图像描述

于 2011-07-06T08:22:02.167 回答
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 App/Project 并在 DEVPATH 目录中添加对您的 dll 的引用。

添加对dll的引用

确保您配置了"local copy = false, specific version = false"。如您所见,Strong name (Starker Name) is true

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

笔记!我尝试从 VS 启动 UI 应用程序,但因加载异常而失败。但是从资源管理器窗口启动它 - 成功。似乎从 VS 启动 UI 应用程序会导致 CLR 在其他地方查找引用的 DLL。


你也可以看看MSDNMSDN2

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

您也可以查看以下文章/网页。

CodeProject - 装配位置、绑定、部署

关于 DEVPATH 的社交 MSDN 问题

我认为这应该可以解决问题!

于 2011-07-04T06:36:14.387 回答
0

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

于 2011-06-23T13:09:55.807 回答
0

Windows 事件日志应提供有关无法加载的更多信息。您是否在新的 DLL 中引入了另一个依赖项?我遇到过类似的情况,第 3 方 DLL 需要安装 C++ Runtime 2005(大多数开发机器和大多数桌面都是这种情况,因为它很常见)。

于 2011-07-03T10:48:49.280 回答
0

疯狂的猜测......你能检查一下DLL所在的文件夹是否标记为只读。

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

重建您的解决方案。

于 2011-07-04T05:59:44.170 回答