在 Windows 10 通用 Windows 库中引用 BindingFlags 类型时无法加载程序集
Unable to load assembly when referencing BindingFlags type in Windows 10 Universal Windows library
当 运行 单元测试时,在我的可移植运行时库 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 类型的方法时,我都会收到以下异常。调用开始时发生异常(大概是在对函数进行 jit 时)。
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)
添加对 nuget 包的引用:
System.Reflection
System.Reflection.Extensions
System.Reflection.Primitives
添加这些软件包是正确的做法。这就是您看到此行为的原因:
BindingFlags
目前 [1] 暴露在 System.Reflection.TypeExtensions
。
- 编译 .NET Core class 库时,编译器将类型引用记录为
System.Reflection.TypeExtensions!System.Reflection.BindingFlags
。
- 当您从 .NET Framework 应用程序使用 class 库时,您需要添加对
System.Reflection.TypeExtensions
的引用,否则编译器无法解析类型。对于必须部署所有代码才能 运行. 的单元测试项目也是如此。
- 在 运行 时,CLR 将解析该类型,找到指向
mscorlib!System.Reflection.BindingFlags
的类型转发并愉快地 运行 您的代码。
作为一般经验法则:.NET Core 旨在以应用程序本地方式部署框架,换句话说,当您的应用程序部署到文件夹时,需要关闭所有依赖项部署也。虽然单元测试项目在概念上是 class 库,但同样适用,因为它们像应用程序一样执行。
当然,我们不希望人们手动调整引用并寻找依赖项。您目前看到的是预发布位,我们的工具体验中并非所有部分都做正确的事情。
我这边的两个问题:
你使用哪个单元测试框架?我假设它是 MSTest (Microsoft.VisualStudio.TestTools.UnitTesting),而不是 xUnit 或 NUnit?
你用的是哪个 运行ner?我假设它是内置的 Visual Studio Test Explorer(与 ReSharper 或 TestDriven.NET 相对)?
[1] 我说目前是因为根据客户反馈,我们 decided 将其移回 System.Reflection
,连同采用 BindingFlags
.
的 API
当 运行 单元测试时,在我的可移植运行时库 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 类型的方法时,我都会收到以下异常。调用开始时发生异常(大概是在对函数进行 jit 时)。
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)
添加对 nuget 包的引用:
System.Reflection
System.Reflection.Extensions
System.Reflection.Primitives
添加这些软件包是正确的做法。这就是您看到此行为的原因:
BindingFlags
目前 [1] 暴露在System.Reflection.TypeExtensions
。- 编译 .NET Core class 库时,编译器将类型引用记录为
System.Reflection.TypeExtensions!System.Reflection.BindingFlags
。 - 当您从 .NET Framework 应用程序使用 class 库时,您需要添加对
System.Reflection.TypeExtensions
的引用,否则编译器无法解析类型。对于必须部署所有代码才能 运行. 的单元测试项目也是如此。
- 在 运行 时,CLR 将解析该类型,找到指向
mscorlib!System.Reflection.BindingFlags
的类型转发并愉快地 运行 您的代码。
作为一般经验法则:.NET Core 旨在以应用程序本地方式部署框架,换句话说,当您的应用程序部署到文件夹时,需要关闭所有依赖项部署也。虽然单元测试项目在概念上是 class 库,但同样适用,因为它们像应用程序一样执行。
当然,我们不希望人们手动调整引用并寻找依赖项。您目前看到的是预发布位,我们的工具体验中并非所有部分都做正确的事情。
我这边的两个问题:
你使用哪个单元测试框架?我假设它是 MSTest (Microsoft.VisualStudio.TestTools.UnitTesting),而不是 xUnit 或 NUnit?
你用的是哪个 运行ner?我假设它是内置的 Visual Studio Test Explorer(与 ReSharper 或 TestDriven.NET 相对)?
[1] 我说目前是因为根据客户反馈,我们 decided 将其移回 System.Reflection
,连同采用 BindingFlags
.