【问题标题】:Types loaded from an assembly file are not equal to the same type when referenced in .NET Core在 .NET Core 中引用时,从程序集文件加载的类型不等于同一类型
【发布时间】:2018-02-10 03:24:45
【问题描述】:

我取了一个Type,查询它的程序集位置,然后从同一个地址加载程序集,从加载的程序集中找到相同的类型。结果类型不等于原始类型。

这是测试用例:

[TestMethod]
public void TestTypeLoadingWithFilePath()
{
    var originalType = typeof(SomeClass);
    var assemblyAddress = originalType.Assembly.Location;

    var loadedAssembly = Assembly.LoadFile(assemblyAddress);
    Assert.IsNotNull(loadedAssembly);

    var loadedType = loadedAssembly.GetType(originalType.FullName);
    Assert.IsNotNull(loadedType);

    Assert.AreEqual(originalType, loadedType);
}

最后一个断言测试失败。

这只发生在 Windows 上的 .NET Core 上。 (我正在测试最新版本,2.1.4)。但 .NET Framework 并非如此。

我的问题是:

  • 这是设计使然还是错误?
  • 如果是设计使然,为什么?
  • 同样,如果这是设计使然,这是否意味着 .NET Standard 的两个实现之间的行为不同? (.NET Core 与 .NET Framework)

【问题讨论】:

  • 如果针对 UnderlyingSystemType 进行测试会发生什么?我的意思是: Assert.AreEqual(originalType, loadedType.UnderlyingSystemType);测试通过了吗?
  • 不。 UnderlyingSystemType 也失败了。
  • 我还在 GitHub 上向 CoreFX 团队报告了这一情况,以获得直接反馈。供参考:github.com/dotnet/corefx/issues/27004
  • 谢谢,我会监控这个问题,这很奇怪......
  • 需要注意的是,如果将加载的程序集与 originalType.Assembly 进行比较,它们不相等(在 .Net Core 版本中)。所以它与类型不同无关,因为类型来自的程序集不同

标签: c# .net .net-core


【解决方案1】:

这是正常行为。使用Assembly.LoadFile 将加载程序集并为其创建一个新的“实例”。要解决此问题,只需使用 Assembly.LoadFrom 代替。如果请求的程序集已加载,这将首先在当前上下文中查找,如果已加载,则获取该程序集。然后像你正在做的那样比较类型。

编辑:我不知道它是否有意,但这种方法适用于 .NetFramework 和 .NetCore。

【讨论】:

  • 我确认LoadFrom 按预期工作。但是前一种方法的行为变化,或者网络框架和网络核心之间的差异,很奇怪,让我觉得这应该是一个错误或什么的。
  • 我认为这只是使用 GAC 的网络框架问题(netcore 没有 GAC)。
猜你喜欢
  • 2020-08-14
  • 2019-11-16
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多