在单元测试中调试 System.IO.FileLoadException

And*_*ray 5 c# unit-testing assembly-resolution

对于我正在现代化的项目,我有一套由应用程序的原始开发人员提供的单元测试。在我的现代化改造早期,它们是完全绿色运行的。然而,它们已经变成红色,但大多数情况下都有相同的例外:

例外:

System.IO.FileLoadException: Could not load file or assembly 'MyApp.BusinessLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.  Access is denied.

at MyApp.SomeExecutable.SomeClass.SomeMethod(args)
at MyApp.UnitTests.SomeExecutableFixture.CanValidateSomething() in [place of invocation of SomeClass.SomeMethod]
Run Code Online (Sandbox Code Playgroud)

异常没有内部异常。

从我所看到的,这发生在任何引用MyApp.BusinessLayer程序集中定义的东西的方法中,友好的错误消息通知我无法加载......显然是由于拒绝访问。

我尝试了以下方法来访问程序集:

  1. 在 Windows 资源管理器中导航到程序集,并授予自己完全访问权限。没有效果。
  2. 导航到 Windows 资源管理器中的包含文件夹并授予我完全访问权限。还是没有效果。
  3. 以管理员身份运行 VS 2015,并重新运行单元测试。没有效果。
  4. 我认为情况很疯狂,所以我检查了 VS 项目中的引用,但它们都指向我应该测试的程序集(它与 UnitTest 程序集位于同一文件夹中。)不可能是这样.
  5. 尝试运行fuslogvw.exe,并在运行时运行测试以了解绑定过程。没有信息出现;就好像在 Visual Studio 2015 中运行测试对 Fusion Log Viewer 完全不可见!即使在重新启动后,Fusion Log Viewer 也没有关于正在发生的程序集绑定的信息。(感谢@AndrewAu、@CodeCaster)
  6. 在建议使用进程监视器实用程序后,发现发生了一些模拟。我授予了 SomeDomain\SomeUser 对被测文件夹的权限;没有效果。(感谢@DarinDimitrov)
  7. 回顾基础知识,确保所有被测程序集都是相同的 .NET 版本 - 特别是 .NET 4.6。他们是; 那不可能(感谢@Kamo)
  8. 与同事商量后,我想起我们刚刚换了笔记本电脑。我尝试在我的旧笔记本电脑上加载代码,它以前在那里工作过。在那里仍然不起作用。
  9. 虽然不是最佳实践,但出于绝望,一位同事建议直接引用业务层 DLL,而不是通过业务层的 C# 项目。这也没有影响(不过,我恢复了项目参考。)
  10. 由于问题的持续性,我将我的分支恢复到我记得没有问题的早期版本,并再次尝试单元测试。 它因同样的问题而失败。 所以,这也不是代码的错。
  11. 当我使用 ReSharper 测试运行程序时,一位同事记得可能会导致此类问题的“阴影复制”设置。我禁用了单元测试运行程序的 Shadow Copy 选项......但它也没有效果。

问题:除了授予自己对该文件夹的完全访问权限之外,我还可以做些什么来解决此问题FileLoadException,尤其是如果这是访问权限问题?我所做的一切难道不应该解决访问问题,如果这是真的吗?