“无法加载文件或程序集‘XXX.YYY’或其依赖项之一。系统找不到指定的文件。”

Posted

技术标签:

【中文标题】“无法加载文件或程序集‘XXX.YYY’或其依赖项之一。系统找不到指定的文件。”【英文标题】:"Could not load file or assembly 'XXX.YYY' or one of its dependencies. The system cannot find the file specified." 【发布时间】:2011-06-02 08:25:35 【问题描述】:

我有一个包含多个项目(类库和 Web 应用程序)的 .net Visual Studio 解决方案。

我做了一些重构,在项目之间移动文件,创建新项目,删除未使用的项目并重命名一些现有项目。

解决方案构建没有问题,但是当我运行 Web 应用程序时,出现以下异常:

“无法加载文件或程序集 'XXX.YYY' 或其依赖项之一。系统找不到指定的文件。”

在折射中删除的名为XXX.YYY的项目输出了一个名为XXX.YYY的dll。但这并没有在应用程序的任何地方使用。我删除了 Web 应用程序 obj 目录和 bin 文件夹并重新构建,但仍然出现。

当这种情况发生时,任何人有任何想法,有什么提示吗??

更新:

更新我的问题。我将代码放置到另一台计算机上并从那里运行它,它成功构建并运行,没有发生此问题。所以这让我觉得问题出在我的电脑上,而不是代码库上。也许我的电脑上缓存了一些东西。我确实在“C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”删除了我的临时文件,但没有运气。

所以任何其他可以缓存的东西或任何其他原因导致它发生在我的电脑上。

进一步更新

关于此的另一个更新。我在其他开发人员机器上运行了相同的代码,他运行它没有问题。所以肯定是我机器上的东西!我们机器上唯一的不同是我在经典模式下使用应用程序池运行 IIS7。另一个开发者正在运行 IIS6。

2 篇关于信息的新文章。首先,在我的 web.config 中的 httpmodules 中,我必须先删除一个自定义 http 模块,然后再添加它。其他开发人员不必这样做。其次,我已经能够通过“hack”修复“无法加载文件或程序集'XXX.YYY'或其依赖项之一”问题,这只是通过在我的项目中创建一个名为XXX的类库的短期修复.YYY 并包括正在查找的类,它们都是自定义控件,即。继承自 System.Web.UI.WebControls.WebControl。

任何进一步的想法......

【问题讨论】:

您是否尝试过清理您的 ASP.NET 临时文件目录? C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files @Harvey - 尝试删除临时文件但仍然没有成功 @jgritty 是的,我在 Web 应用程序的 bin 目录中的所有 dll 上都使用了反射器,但找不到对 XXX.YYY 的任何引用。 您是否尝试过在项目目录中使用 findstr 来查看谁引用了 xxx.yyy? cd ; findstr /I /S /L XXX.YYY - 你会在控制台上得到一些垃圾,因为至少有一个二进制文件会在其中引用该名称。如果垃圾太多,请进行 2 次通过,按照说明进行一次,在另一次通过时添加 /M 。请注意,/L 表示搜索是文字的。 好的...我现在非常好奇为什么会这样。 :) 1) 您是否在损坏的机器上运行了有效的防病毒软件?我希望不是赛门铁克或迈克菲。 :) 如果没有,请使用信誉良好的在线扫描仪之一,然后如果发现/修复了任何问题,请再次检查您的问题代码。 2)是否可以卸载受此问题影响的.Net运行时Visual Studio,然后重新安装?当第一个 .Net 运行时发布时,我们遇到了类似的问题,并找到了两种修复方法。 1是我描述的方法,2是完全重装windows、VS等... 【参考方案1】:

有两个可能的原因。

1) 当你运行你的 webapp 时,你仍然在你机器上的某个地方使用旧的程序集。您的旧程序集引用了旧程序集“XXX.YYY”。

2) 您构建的最新二进制文件仍然引用旧程序集“XXX.YYY”。

要找出你的 webapp 使用了哪些程序集,如果你正在运行调试器,你可以很容易地从输出窗口中找到它。它应该是输出的前几行。另一种查找方法是在调试期间在 VS.NET IDE 中打开模块窗口。

如果由于某些原因无法调试或附加调试器时遇到问题,另一种更简单的方法是使用fuslogvw。它为您提供所有成功加载的程序集以及未能加载的程序集的确切位置。请确保您在 Windows 7 中以管理员身份运行 fuslogvw。

找出您的 webapp 成功加载了哪些程序集后,您可以对这些程序集执行 ildasm 以查看它们引用了哪些程序集。不幸的是,您需要一一检查。

我的猜测是,您成功加载的一些程序集实际上来自 ASP.NET 缓存或 GAC 中的某个位置。

【讨论】:

我也想提到融合记录器,但我不记得工具名称了。【参考方案2】:

为构建输出启用诊断日志记录(工具 -> 选项 -> 构建和运行 -> 输出日志详细程度 -> 诊断)并构建解决方案并查看 Visual Studio 从何处选择 dll(somedll.dll 版本 xxx.yy )。现在运行应用程序并查看运行时尝试解析 dll 的位置。 (Windbg 是一个选项)。

【讨论】:

【参考方案3】:

只需检查项目构建配置。如果您的引用中有一个 64 位编译的 dll,并且您的主项目是 32 位(或任何 cpu 并且您的机器是 32 位),反之亦然,您将收到此错误

【讨论】:

这不会引发 BadImageFormat 异常吗? @BrokenGlass - 是的.. 它使用此描述“无法加载文件或程序集'XXX.YYY,版本 = 1.0.XXX,文化 = 中性,PublicKeyToken = null'或其依赖项之一。”【参考方案4】:

搜索文本“XXX.YYY”并删除所有出现的解决方案。也许你在一些 web.config 文件中遗漏了一些东西。

此外,如果解决方案搜索未找到任何内容,您可以检查 *.csproj 文件。它们基本上是文本文件,因此删除引用应该没有问题。

【讨论】:

尝试在整个解决方案(所有文件)中搜索 XXX.YYY,但没有找到任何参考。感谢您的意见【参考方案5】:

在您的所有 EXE 和 DLL 上使用 Dependency Walker(依赖)来查看哪个缺少依赖项。您应该从项目的工作目录运行依赖以获得最佳结果。

一旦你知道哪个 EXE/DLL 是罪魁祸首,进入该项目的设置,看看那里是否提到了抱怨的依赖关系。

编辑:几分钟前我发生了另一件事...... 如果您的任何依赖项被“阻止”,因为它们被某些 MS tardware 标记为已下载(例如,当您使用 Inet Explorer 进行 DL 时)可能会阻止加载可执行代码。使用 Windows 资源管理器查看可执行文件 (DLL/EXE) 的属性,看看它们在第一页上是否有取消阻止按钮。如果是这样,请单击该按钮。 这花了我一些时间才弄清楚,希望它会有所帮助。

【讨论】:

使用Windows资源管理器,我右键单击bin目录中的所有dll并查看属性。我没有在任何地方看到阻止/解除阻止。如果与此相关,我应该在哪里看到它?我以前没有使用过 Dependency Walker,所以我对它的工作方式是新手。我是否用它打开我的 bin 目录中的每个 dll? (注意:bin目录是web应用的目录,是不是所有的类库都需要这样做?我有30+!) Dependency Walker据我所知从PE的导入导出表解析DLL依赖。除非他使用了一些非托管的 DLL,否则我看不到依赖行者有什么帮助。最新的依赖遍历器是否也可以遍历组件的引用? @Niall Collins:没有阻止选项,只有解除阻止。如果你没有看到它,你应该没问题。 @Harvey Kwok:我在类似情况下使用过 Dependency Walker 并解决了问题。我不确定它是如何工作的,但它对我有用。【参考方案6】:

您只是缺少一个依赖项。可能是项目 A 引用了项目 B,而项目 B 又引用了项目 C。您的输出目录缺少项目 C 的 DLL。

【讨论】:

但如果是这种情况,解决方案将无法构建 - 对吗?解决方案正在构建中。 @Niall 不一定。所有项目都在同一个解决方案中,因此每个项目都有其所需的引用,并且所有项目都按照构建依赖项所需的顺序构建。对于已发布的应用程序,只要 bin 文件夹包含所需的所有 DLL,该应用程序就会运行,但如果缺少单个 DLL,您就会看到遇到的问题。您是将应用程序发布到 IIS 还是仅在 VS 中调试? 有趣。我在 Windows 7 pc 上的本地 IIS7 上运行它。这有关系吗?【参考方案7】:

好消息我已经解决了这个问题!!!我不得不重新安装我的 .net 运行时环境。我还从 IIS 中删除了网站并再次读取了该网站。当我运行它时,没有出现问题并且站点运行了。

非常感谢大家的帮助和帮助,非常感谢。所有的建议和帮助引导我朝着解决这个问题的方向前进!

【讨论】:

【参考方案8】:

转到References 中的Solution Explorer 中的Visual Studio。选择被投诉的程序集。选择它并转到View 菜单选项并选择底部的Property Window。选择程序集后,在属性窗口中查看其属性并查找Copy Local 值。如果其值设置为False,则将其设置为True。构建解决方案并发布它。它应该成功地解决了这个问题。

【讨论】:

以上是关于“无法加载文件或程序集‘XXX.YYY’或其依赖项之一。系统找不到指定的文件。”的主要内容,如果未能解决你的问题,请参考以下文章