NDepend TypeInitialization使用 NUnit 测试时的异常

本文关键字:异常 测试 NUnit TypeInitialization 使用 NDepend | 更新日期: 2023-09-27 18:32:40

所以我正在尝试使用 NDepend API 为我的代码上的一些指标设置一个项目(这很好用(,但是,当我尝试在其上运行测试框架 (NUnit( 时,我得到了 TypeInitializationExceptions 抛出。

以下是一些代码来重现我遇到的错误:

  • 创建一个类库项目,并在$NDependInstallPath$'lib'NDependAPI引用 NDepend API dll,将 copy local 设置为 false 。创建一个类,如下所示:

    public class NDependProjectLoader
    {
      public void LoadAnNDependProject()
      {
        var provider = new NDependServicesProvider();
      }
    }
    
  • 在解决方案中创建第二个类库项目,该项目将成为您的 Test 类。 引用 NUnit 和您创建的引用 NDependAPI 的项目

    [TestFixture]
    public class NDependProjectLoader_Tests
    {
      [Test]
      public void I_can_load_an_depend_project()
      {
        new NDependProjectLoader().LoadAnNDependProject();
      }
    }
    
  • 使用您选择的测试运行器构建并运行测试(我已经尝试过 Resharper 的测试运行器和 NUnit GUI(。

  • 您将在 var provider = new NDependServicesProvider((;

  • 查看 TypeInitializationException 内部显示根异常的消息是:

"{"Could not load file or assembly 'NDepend.Platform.DotNet' or one of its dependencies. The system cannot find the file specified.":"NDepend.Platform.DotNet"}".

  • 从 NDepend.PowerTools 示例项目添加程序集解析程序帮助程序并按照入门指南中所述调用它不会更改行为。

  • 我/假设/问题与NDepend API入门指南中的此语句有关 http://www.ndepend.com/api/NDepend.API_gettingstarted.html

"程序可执行程序集必须生成为 $NDependInstallPath$''">

  • 如果代码是从测试运行器启动的,则可执行文件将不在 ndepend 安装路径中。

  • 从.exe在 $NDependInstallPath$''lib'' 中生成的控制台应用程序调用 NDependProjectLoader.LoadAnNDependProject(((请注意,.exe似乎需要在 ''lib'' 子文件夹中生成,而不是在入门指南中所述的 $NDependInstallPath$'' 中生成(不会产生异常,这进一步指出这是原因。

因此,问题是,如何从控制台应用程序以外的任何内容使用 NDepend API?例如,在这里我想从测试运行程序执行此操作。另一个明显的候选者是 IIS 应用程序。我错过了一些明显的东西吗?

NDepend TypeInitialization使用 NUnit 测试时的异常

事实上,问题来自程序集分辨率。您必须告诉 CLR 在哪里可以找到 NDepend 程序集(即在目录 $NDependInstallPath$''Lib( 中(您有 2 个选择来执行此操作。假设 $NDependInstallPath$ 是 "C:''NDepend",例如:

  • 编辑 AssemblyResolverHelper 以解析"C:''NDepend''Lib"中的程序集

  • 要么为您的 exe 创建一个 App.Config 文件,添加一个引用"C:''NDepend''Lib"的 <probing> 元素。当 CLR 无法解析程序集时,它将查看此类元素中的目录