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

9
我有一个包含多个项目(类库和Web应用程序)的.NET Visual Studio解决方案。
我进行了一些重构,将文件移动到不同的项目中,创建新项目,删除未使用的项目并重命名一些现有项目。
解决方案可以成功构建,但运行Web应用程序时出现以下异常:
“无法加载文件或程序集'XXX.YYY'或其某个依赖项。系统找不到指定的文件。”
在重构过程中删除的名为XXX.YYY的项目输出了一个名为XXX.YYY的DLL。但是,在应用程序中没有使用它。我已经删除了Web应用程序的obj目录和bin文件夹,并重新构建,但仍然出现此问题。
有人有任何想法这可能发生在什么情况下,有任何提示吗?
更新:
我的问题更新。我将代码放在另一台计算机上运行,成功构建并运行,没有出现此问题。因此,这使我认为问题出在我的PC上而不是代码库上。也许我的PC上有一些缓存。我确实删除了“C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files”中的临时文件,但没有运气。
还有什么其他可能被缓存或发生在我的PC上的原因。
进一步更新
关于此事的另一个更新。我在另一位开发人员的计算机上运行了相同的代码,他没有运行它时出现问题。因此肯定是我的机器上有些东西!我们机器上唯一的不同之处在于我正在运行IIS7,并且应用程序池处于经典模式下。另一位开发人员正在运行IIS6。
有两个新信息。首先,在我的Web.config中的httpmodules中,我必须删除自定义http模块,然后再添加它。另一位开发人员不必这样做。其次,我已经通过创建一个名为XXX.YYY的类库来解决“无法加载文件或程序集'XXX.YYY'或其某个依赖项”问题,其中包含被查找的所有类,这些类都是自定义控件,即继承自System.Web.UI.WebControls.WebControl。
还有其他想法吗?

1
你尝试过清理 ASP.NET 临时文件目录吗?C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files - Harvey Kwok
@jgritty 是的,我在我的 Web 应用程序的 bin 目录中的所有 DLL 上使用了反射器,但是找不到任何对 XXX.YYY 的引用。 - amateur
你有没有尝试在项目目录中使用findstr来查看谁引用了xxx.yyy?cd <project base dir>; findstr /I /S /L XXX.YYY- 由于至少有一个二进制文件会引用该名称,因此控制台上会输出一些垃圾信息。如果输出的垃圾信息太多,请进行两次搜索,第一次按照上述方式执行,第二次则加上/M。请注意,/L表示搜索字面值。 - JimR
1
好的...我现在非常好奇为什么会发生这种情况。 :) 1) 在出问题的机器上是否有运行中的防病毒软件?希望不是 Symantec 或 McAfee。 :) 如果没有,请使用其中一个值得信赖的在线扫描程序,然后如果发现/修复了任何问题,请再次检查您的问题代码。2) 是否可以卸载受此问题影响的 Visual Studio、.Net 运行时,然后重新安装?我们在最初发布 .Net 运行时时遇到了类似的问题,并找到了两种解决方法。一种是我描述的方法,另一种是完全重新安装 Windows、VS 等... - JimR
@Niall 你试过我的建议了吗?解决汇编参考问题不应该很难。这个想法是使用fuslogvw来定位正在使用哪些程序集,然后对每个已加载的程序集使用ildasm。它会告诉你它们在清单部分引用了哪些程序集。如果你还没有尝试,我认为值得一试。 - Harvey Kwok
显示剩余6条评论
8个回答

6
有两种可能的原因。
1)当您运行Web应用程序时,您仍然在计算机上某个地方使用旧的程序集。您的旧程序集引用了旧的程序集“XXX.YYY”。
2)您构建的最新二进制文件仍然引用旧的程序集“XXX.YYY”。
如果您正在运行调试器,则可以轻松地从输出窗口中找出您的Web应用程序使用哪些程序集。它应该是输出的前几行。在调试期间,另一种查找方法是在VS.NET IDE中打开模块窗口。
如果由于某些原因无法调试或无法附加调试器,则另一种更简单的方法是使用fuslogvw。它会为您提供所有成功加载的程序集以及未能加载的程序集的确切位置。请确保在Windows 7中以管理员身份运行fuslogvw。
在找到您的Web应用程序成功加载的程序集之后,您可以对这些程序集进行ildasm,以查看它们引用了哪些程序集。不幸的是,您需要逐个检查它们。
我的猜测是,你成功加载的一些程序集实际上来自于ASP.NET缓存或GAC中的某个位置。

我还想提一下融合日志记录器,但我记不起那个工具的名字了。 - jgritty

2

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


1

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


那不会抛出一个 BadImageFormat 异常吗? - BrokenGlass
@BrokenGlass - 是的...它显示了这个描述:“无法加载文件或程序集“XXX.YYY,Version=1.0.XXX,Culture=neutral,PublicKeyToken=null”或其某个依赖项。” - Tolgahan Albayrak

1

使用Dependency Walker(depends)检查所有的EXE和DLL文件,以查看缺失的依赖项是哪一个。为了获得最佳结果,您应该从项目的工作目录运行depends。

一旦确定了是哪个EXE/DLL文件有问题,进入该项目的设置中查看是否提到了所抱怨的依赖项。

编辑:几分钟前我想到了另一件事情... 如果您的任何依赖项因为被某些MS硬件标记为已下载而被“阻止”,那么这可能会防止可执行代码加载。使用Windows资源管理器查看您的可执行文件(DLL/EXE)的属性,看看它们的第一页上是否有一个取消阻止的按钮。如果有,点击该按钮。 我曾经花了一些时间才弄清楚这个问题,希望这能帮到您。


使用Windows资源管理器,在bin目录中右键单击所有dll文件并查看属性。我没有看到任何阻止/解除阻止的选项。如果与此相关,我应该在哪里看到它?我以前没有使用过Dependency Walker,所以对其工作方式很生疏。我需要用它打开bin目录中的每个dll文件吗?(注意:bin目录是Web应用程序的目录,我需要为所有类库都这样做吗?我有30多个!) - amateur
据我所知,Dependency Walker可以从PE的导入和导出表中解析DLL依赖关系。除非他正在使用一些非托管的DLL,否则我不认为Dependency Walker会有所帮助。最新的Dependency Walker是否可以遍历程序集的引用呢? - Harvey Kwok
@Niall Collins:没有封锁选项,只有解除封锁。如果你看不到它,那就没问题了。 - JimR
@Harvey Kwok:我在类似的情况下使用了Dependency Walker并解决了问题。虽然我不确定它是如何工作的,但它对我很有效。 - JimR

1

在文本“XXX.YYY”中进行解决方案搜索并删除所有出现的内容。也许您在某些web.config文件中遗漏了一些内容。

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


尝试在整个解决方案(所有文件)中搜索XXX.YYY,但没有找到任何引用。感谢您的输入。 - amateur

0

Visual StudioSolution Explorer 中前往 References。选择出现问题的程序集,然后进入 View 菜单选项并选择底部的 Property Window。当程序集被选中时,在属性窗口中查看其属性,并查找 Copy Local 值。如果它的值设置为 False,请将其设置为 True。构建解决方案并发布它。这应该成功解决问题。


0
你只是缺少一个依赖项。可能是这样的情况:项目A引用了项目B,而项目B又引用了项目C。你的输出目录缺少了项目C的DLL文件。

但如果是这种情况,解决方案将无法构建 - 对吗?解决方案正在正常构建。 - amateur
@Niall 不一定。所有项目都在同一个解决方案中,因此每个项目都有其所需的引用,并且按照构建依赖项所需的顺序进行构建。对于已发布的应用程序,只要 bin 文件夹包含所有所需的 DLL,则应用程序将运行,但如果缺少单个 DLL,则会出现您正在经历的问题。您是将应用程序发布到 IIS 还是仅在 VS 中进行调试? - mikesigs
有趣。我正在我的Windows 7电脑上的本地IIS7上运行它。这会有影响吗? - amateur

0

好消息,我解决了这个问题!!!我不得不重新安装我的 .net 运行环境。我还从 IIS 中删除了站点,并重新添加了网站。当我运行它时,问题没有发生,网站正常运行。

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


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