在 Windows 10 通用 Windows 库中引用绑定标志类型时无法加载程序集

本文关键字:Windows 类型 加载 程序集 标志 绑定 通用 引用 | 更新日期: 2023-09-27 18:33:40

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

该项目是一个 C# 可移植运行时库,配置为支持 .net Framework 4.6 和 Windows Universal 10.0。测试项目配置为使用 .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)

在 Windows 10 通用 Windows 库中引用绑定标志类型时无法加载程序集

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

  1. BindingFlags目前在System.Reflection.TypeExtensions中暴露[1]。
  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 Test Explorer(而不是ReSharper或 TestDriven.NET(?


[1] 我之所以说目前,是因为根据客户反馈,我们决定将其移回 System.Reflection ,以及需要BindingFlags的 API。

添加对 nuget 包的引用:

System.Reflection
System.Reflection.Extensions
System.Reflection.Primitives
相关文章: