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

VS2017 Could not load file or assembly Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll or one of its dependencies

当尝试在 VS2017 中打开一个旧的解决方案时,有一个旧的单元测试项目在构建时给我带来了问题。

我在构建这个测试项目时不断收到以下错误:

Could not load file or assembly 'file:///C:\Projects\MyProj\Test\DAL\UnitTestProj\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll' or one of its dependencies. The system cannot find the file specified.

我检查了项目的引用,它似乎引用了 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll。此外,没有代码错误。我怎么能弄清楚它是否是它找不到的依赖项之一?

我在一个最初使用 VS2010 开发的项目中遇到了类似的问题(附加消息 The "BuildShadowTask" task failed unexpectedly),我花了最后几个小时来学习构建过程的另一个遗留方面。

很有可能您正在处理 private accessor files (.accessor), which were deprecated in VS2012 (original source). This was foreshadowed in an announcement from the VS2010 team 他们不再处理这些功能的问题。

您也有可能只是在处理对错误版本的 UnitTestFramework 的错误引用,但 NuGet 恢复应该可以解决此问题。如果不是,请参阅 this GitHub thread for a possible fix (manually change the ref to the public folder), or move to the new MSTest.TestAdapter and MSTest.TestFramework packages (see MSDN support thread)。

解决方案

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

乙。更好的是,只需从单元测试项目的 Test References 文件夹中删除所有 .accessor 文件。

理想情况下,您还可以重写单元测试以删除对私有方法的引用,方法是重新构建以分离关注点或将属性更改为 internal 并将“朋友”与 InternalsVisibleToAttribute.


由于某些原因需要继续支持私有方法测试的,同post对逻辑问题"What is available for me then?"提供如下建议:

For those who wish to continue testing internal APIs, you have three options:

  1. Use the Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject class to assist in accessing internal and private APIs in your code. This is found in the Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll assembly.
  2. Create a reflection framework that would be able to reflect off your code to access internal or private APIs.
  3. If the code you are trying to access is internal, you may be able to access your APIs using the InternalsVisibleToAttribute so your test code can have access to the internal APIs.

However, there is not any good replacement for Code Generation for the new features added by the lanugage teams. You may create the TestMethod stubs and then remove the internal code. You only need to keep the stub itself.


进一步阅读/帮助我拼凑起来的资源:

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

这与 Visual studio Enterprise 2015 有关,添加新的负载测试失败:并吐出 "Unable to find assembly 'Microsoft.VisualStudio.QualityTools.LoadTest, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

由于安装在 public 中的程序集在 GAC 中显示为版本 10.0.0.0,

GAC 只有 10.1.0.0。一旦 GAC 更新为 10.0.0.0 并重新启动 VS 2015。应该可以解决与此类似的问题。

为了更好的推理,系统组装路径和项目路径的更多细节 动态链接库路径 ......\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll

.CSProj参考版

尝试完全卸载 Visual Studio 2017 (不修复)。然后下载最新版本并安装。请记住检查 MSBuild 是否已添加到安装文件中。记得删除 Documents 里面的文件夹:Documents\Visual Studio 2017。就我而言,这个简单的解决方案修复了所有错误。

我在 Visual studio 2022 年将项目升级到 .Net4.8 时遇到了同样的问题,之前我们使用的是 Visual studio 2017。

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

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

Unit test private methods?

Unit Testing: Exposing Private Members