我有一个带有许多 dll 的 .net 3.5 应用程序,我尝试在不构建整个应用程序的情况下重建特定的 dll,但是在用新的替换旧的后,应用程序抛出异常,因为它无法加载新的 dll 异常:System.IO .FileLoadException: 无法加载文件或程序集....我知道它会搜索具有特定版本和公共令牌的程序集,如何在不重新构建应用程序的情况下解决此问题?该应用程序也已签名但未在 GAC 中注册。PS:我怎样才能跳过再次构建应用程序,或者它是重新构建dll时必须的?
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 来解决此问题。您不必重建整个应用程序。
您是否尝试使用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
3) 然后转到您的 UI App/Project 并在 DEVPATH 目录中添加对您的 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。
备注:仅在开发时使用此设置。运行时不会检查在 DEVPATH 中找到的强名称程序集的版本。它只是使用它找到的第一个程序集。
您也可以查看以下文章/网页。
我认为这应该可以解决问题!
您应该重建那些引用这个新 dll 的程序集。
Windows 事件日志应提供有关无法加载的更多信息。您是否在新的 DLL 中引入了另一个依赖项?我遇到过类似的情况,第 3 方 DLL 需要安装 C++ Runtime 2005(大多数开发机器和大多数桌面都是这种情况,因为它很常见)。
疯狂的猜测......你能检查一下DLL所在的文件夹是否标记为只读。
右键单击文件夹>属性>取消选中只读>单击应用>选择所有子文件夹和文件>确定。
重建您的解决方案。