VS2017无法加载文件或程序集Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll或其依赖项

44
尝试在VS2017中打开旧的解决方案时,一个旧的Unit Test项目在构建时会出现问题。
在构建测试项目时,我一直收到以下错误提示:
“无法加载文件或程序集“file:///C:\Projects\MyProj\Test\DAL\UnitTestProj\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll”或其中一个依赖项。系统找不到指定的文件。”
我检查了该项目的引用,发现它引用了“Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll”。此外,没有代码错误。如何确定是否是其无法找到的某个依赖项呢?

1
好的,C:\Projects\MyProj\Test\DAL\UnitTestProj\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll' 在那里实际上存在吗?想一想,它为什么会在那里呢?请删除该引用,并使用引用管理器的“程序集”选项卡将其添加回去。不要在磁盘上浏览 DLL。 - user1228
1
@Will 我也在想同样的事情... 它是否真的试图在我的项目目录中找到它?我已经尝试将其删除,然后转到引用管理器>扩展,然后有大约5个Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll的重复可供引用。当引用时,我仍然得到相同的错误...不确定是什么东西告诉项目在C:\Projects\MyProj...中查找dll...当我转到引用>程序集时,我看不到它...只有扩展中有它。 - Blake Rivell
1
是的,扩展。很奇怪。我看到与我的测试一起工作的那个是C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ PublicAssemblies \ Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll。你知道,你总是可以创建一个新的测试项目,手动移动你的类并放弃损坏的项目文件... - user1228
@Will 这是最奇怪的事情...即使通过Microsoft Visual Studio 14.0\Common7\IDE\ReferenceAssemblies重新引用程序集,它仍然会出错,说它正在项目目录中寻找。 - Blake Rivell
@Will 这可能是我会做的事情,但是当涉及到这种事情时,我无法忍受处理源代码控制。此外,由于测试项目是我没有创建的项目,所以我希望它仍然是同样的旧版本。 - Blake Rivell
另一个选择是创建一个新的测试项目,手动添加文件但将它们作为链接添加(以便它们存在于原始项目中),并使第二个测试项目运行起来。一旦验证它正常工作,卸载两个项目并将失败的项目与正常工作的项目进行比较。可能存在某些手动操作在csproj文件中导致问题发生。 - user1228
7个回答

83
我遇到了类似的问题(附加信息为The "BuildShadowTask" task failed unexpectedly),这个项目最初是使用VS2010开发的,我花了几个小时学习构建过程的另一个遗留方面。
很有可能你正在处理私有访问器文件.accessor),这在VS2012中已经弃用原始来源)。这在VS2010团队的公告中预示着他们不再继续开发这些功能。

你可能只是在处理对UnitTestFramework错误版本的引用,但NuGet恢复应该可以解决这个问题。如果不能,请参见此GitHub线程以获取可能的解决方法(手动更改对公共文件夹的引用),或者切换到新的MSTest.TestAdapter和MSTest.TestFramework软件包(请参见MSDN支持线程)。

解决方案

A. 编辑单元测试.csproj并将项目Include引用从Shadow => None更改: <Shadow Include="Test References\namespace.accessor" />
<None Include="Test References\namespace.accessor" />

B. 更好的方法是,直接从单元测试项目的Test References文件夹中删除所有.accessor文件。

理想情况下,您还应重写单元测试以删除对私有方法的引用,要么通过重新架构以分离关注点,要么通过将属性更改为internal并使用InternalsVisibleToAttribute的“friend”。


对于那些由于某种原因需要继续支持私有方法测试的人,同一篇文章提供了以下建议回答逻辑问题"那么我有什么选择?":

如果您希望继续测试内部API,您有三个选项:

  1. 使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject类来帮助访问代码中的内部和私有API。这可以在Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll程序集中找到。
  2. 创建一个反射框架,能够反射您的代码以访问内部或私有API。
  3. 如果您要访问的代码是内部的,则可以使用InternalsVisibleToAttribute让您的测试代码可以访问内部API。

然而,对于语言团队添加的新功能,没有任何良好的代码生成替代品。您可以创建TestMethod存根,然后删除内部代码。您只需要保留存根本身。


进一步阅读/帮助我理解这个问题的来源:


1
我在将我的项目移动到 TFS CI 构建时遇到了问题。删除“Shadow”节点解决了它 - 谢谢您! - jwill212
2
对我有用。VS 2019。 - Zoomzoom

5
右键单击项目引用文件夹。添加引用 > 程序集 > 扩展。勾选 Microsoft.VisualStudio.QualityTools.UnitTestFramework 10.1,取消勾选任何旧版本。

在程序集>扩展中没有这样的条目...(实际上没有)...你在哪里找到这个dll?它不能直接通过nuget添加... - veljkoz
这是解决方案。 - hyankov
已添加了新的引用,但仍然出现“系统找不到指定的文件”错误。 - null canvas
1
对我没用,不得不选择brichin的答案。VS 2019。 - Zoomzoom
由于某些原因,我的安装程序有3个不同的“版本”,其中两个是10.0,但位于VS2019的两个不同文件夹中。一个在“PublicAssemblies”中,另一个在“ReferencedAssemblies”中。我将其更改为“PublicAssemblies”,重新构建后,DLL出现在bin文件中并解决了问题。 - LarryBud

0
我在我们的构建服务器上构建一个旧产品时遇到了这个错误。我尝试安装了各种组合的Visual Studio Build Tools和插件。
最终解决方案是:安装Visual Studio 2015。完整版的,而不是BuildTools。

0

这与Visual Studio Enterprise 2015有关,添加新的负载测试失败,并显示为“无法找到程序集'Microsoft.VisualStudio.QualityTools.LoadTest,Version = 14.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”

由于公共程序集中安装的程序集显示为版本10.0.0.0,而GAC中缺失该版本,

GAC仅具有10.1.0.0。一旦GAC更新为10.0.0.0并重新启动VS 2015,应解决类似于此问题的问题。

更多详细信息以获得更好的推理,系统程序集路径和项目路径 DLL路径 ......\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll

.CSProj引用版本


2
也许您可以澄清为什么您认为这解决了问题,并澄清需要采取哪些步骤。请注意,您可以格式化示例,以便清楚说明是解释还是路径名。 - user1531971
一旦GAC更新到10.0.0.0版本......如果你能说出你是如何做到的就好了。我的问题是它拒绝启动已编译的程序。我可能可以成功地重新编译它,但我无法保证它与旧版本相同。 - Auspex

0

我曾遇到一个问题,当我将项目升级到 .Net4.8 时,在 Visual Studio 2022 中,我们之前使用的是Visual studio 2017。

错误:
无法从程序集 ***\Microsoft.VisualStudio.TestTools.BuildShadowsTask.dll 加载 "BuildShadowTask" 任务。无法加载文件或程序集“file:///***Microsoft.VisualStudio.TestTools.BuildShadowsTask.dll”或其中之一的依赖项。

解决方案:我从项目中删除了 ".accessor" 文件,因为它被用于访问私有方法(可能已过时)。然后我们使用了 "PrivateObject" 类来访问单元测试中的私有成员。稍后我们更新了单元测试案例。 代码参考可以在以下文章中找到。

如何单元测试私有方法?

单元测试:公开私有成员


0

-3
尝试完全卸载Visual Studio 2017(不是修复)。然后下载最新版本并安装。记得检查是否将MSBuild添加到安装文件中。记得删除文档内的文件夹:Documents\Visual Studio 2017。在我的情况下,这个简单的解决方案修复了所有错误。

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