【问题标题】:What is the difference between a .NET framework DLL and a .NET core DLL? Why do they need seperate runtimes?.NET 框架 DLL 和 .NET 核心 DLL 有什么区别?为什么他们需要单独的运行时?
【发布时间】:2019-07-06 11:24:57
【问题描述】:

使用 ildasm 检查 .NET Core DLL 和 .NET Framework DLL 时,它们看起来非常相似。我能看到的唯一区别是引用(.NET Framework DLL 引用 mscorlib)。

这是有道理的,因为两者都必须符合 ECMA-335。但是,我不明白运行时第一次加载 DLL 时如何知道使用 .NET Core 运行时或 .NET 框架运行时。我也看不出 .NET Framework 无法运行 .NET Core DLL => 的任何原因,只要它可以找到引用,它们都必须是 ECMA-335 DLL。

【问题讨论】:

  • 为什么人们不赞成投票?

标签: .net dll .net-core cil ecma


【解决方案1】:

没有真正的区别,这就是为什么针对 .NET Standard 编译的库可以在两个运行时上运行。

区别主要在于 .NET Core 库认为 System.String 来自 System.Runtime,而 .NET Framework 库认为它来自 mscorlib。使用正确的类型转发 shim 程序集,两个运行时都可以运行为另一个编译的库......直到它们得到 MissingMethodException 或 TypeNotFoundException,因为该库使用了仅在其中一个运行时可用的东西(.NET Core 中的新方法,或 .NET Framework 中存在的 .NET Core 中遗漏的方法)。

运行时差异更加微妙:

  • .NET Core 的每个进程没有多个 AppDomain
  • .NET Core 将 System.Span 作为运行时中的一种特殊类型,以获得更好的性能
  • .NET Framework 有一个用于 4.0 到 4.8 的 GAC
  • .NET Core 为每个补丁版本维护共享框架的单独副本(用于特定于应用的版本锁定)
  • .NET Framework GAC 获胜
  • .NET Core 应用本地文件胜出
  • .NET Core 不再使用 CAS / 部分信任

【讨论】:

  • 酷。运行 .NET 核心应用程序的计算机如何知道在运行 .NET 核心 DLL 时使用哪个运行时?它怎么知道 DLL 实际上是一个 .NET core DLL?
  • @Nick 对于 DLL:它没有。它使用已经加载的任何运行时(dotnet 驱动程序意味着核心)。对于 EXE:最后我知道只有 Framework 有真正的 EXE。 Core 有一个自包含的可执行文件,它可以提取文件并使用 Core 加载它们……所以对于 EXE 来说,答案是“EXE 知道,因为它就是为运行而构建的”
猜你喜欢
  • 2019-04-16
  • 2014-06-25
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2011-01-12
  • 2012-08-12
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多