在Windows 10 Universal Windows库中引用BindingFlags类型时无法加载程序集

Rob*_*ies 8 .net c# portable-class-library visual-studio-2015

运行单元测试时,调用我的可移植运行库DLL中引用"System.Reflection.TypeExtensions"的任何方法都会生成FileNotFound异常,搜索"System.Reflection.TypeExtensions".在Windows 10 Universal应用程序中执行相同的代码时不会发生此错误.

该项目是一个C#可移植运行时库,配置为支持.net Framework 4.6和Windows Universal 10.0.Test项目配置为使用.net Framework 4.6.

每当我尝试调用使用System.Reflection.BindingFlags类型的方法时,我都会收到以下异常.调用开始时会发生异常(大概是在启动函数时).

Test method Sfx.Test.SignalExpressionTest.TestAddExpressions threw exception: 
System.IO.FileNotFoundException: Could not load file or assembly 'System.Reflection.TypeExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.=== Pre-bind state information ===
LOG: DisplayName = System.Reflection.TypeExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
Run Code Online (Sandbox Code Playgroud)

Imm*_*rth 3

添加这些包是正确的做法。以下是您看到此行为的原因:

  1. BindingFlags目前 [1] 暴露在System.Reflection.TypeExtensions.
  2. 当您编译 .NET Core 类库时,编译器会将类型引用记录为System.Reflection.TypeExtensions!System.Reflection.BindingFlags.
  3. 当您从 .NET Framework 应用程序使用类库时,您需要添加对的引用,System.Reflection.TypeExtensions否则编译器无法解析该类型。对于必须部署所有代码才能运行的单元测试项目也是如此。
  4. 在运行时,CLR 将解析类型,找到指向的类型转发mscorlib!System.Reflection.BindingFlags并愉快地运行您的代码。

作为一般经验法则:.NET Core 旨在以应用程序本地方式部署框架,换句话说,当您的应用程序部署到文件夹时,也需要部署所有依赖项的关闭。尽管单元测试项目在概念上是类库,但这同样适用,因为它们像应用程序一样执行。

当然,我们不希望人们手动调整引用并寻找依赖项。您当前看到的是预发布版本,我们的工具体验中并非所有部分都能发挥正确作用。

我这边有两个问题:

  1. 您使用哪个单元测试框架?我假设它是 MSTest (Microsoft.VisualStudio.TestTools.UnitTesting),而不是 xUnit 或 NUnit?

  2. 您使用哪种跑步机?我认为它是内置的 Visual Studio 测试资源管理器(而不是 ReSharper 或 TestDriven.NET)?


[1] 我说目前是因为根据客户反馈,我们决定将其System.Reflection与采用BindingFlags.