【问题标题】:Does .NET Native compile all generics to native code?.NET Native 是否将所有泛型编译为本机代码?
【发布时间】:2020-03-11 12:01:31
【问题描述】:

MSDN:.NET Native 是提前 (“AOT”) 编译:它在您编译时将您的代码转换为本机机器代码

我想知道它如何处理泛型?

【问题讨论】:

  • 可能与即时 (JIT) 编译的方式相同。您有什么理由特别询问泛型吗?
  • 更有资格的人可能肯定知道,但处理泛型的常用方法是 (A) 为使用的每个类型集生成一个单独的版本 (G -> G_of_A, G -> G_of_B),或 (B) 向下转换为通用容器类型(因此 G 将是真正的 G
  • 只是没有什么不同。唯一可能的复杂情况是 .NETNative 需要知道您的代码使用的所有类型参数。这很简单,因为它在编译完所有代码后运行,它可以访问程序使用的所有程序集。这也是它仅支持 appx 包的原因,它可以毫不费力地确定您实际使用的程序集,因为它们已在清单中列出。它唯一不能可靠地做的是检测您通过反射激活的代码,这就是您必须帮助处理 rd.xml 文件的地方。
  • 正如他们所描述的,它是 AOT 编译(提前)。在运行代码之前,运行时无法知道某些泛型类型。通常泛型对 AOT 不友好,它们的类型定义在运行时维护在内存中

标签: .net uwp .net-native


【解决方案1】:

该堆栈中有一个名为 Universal Shared Generics 的功能,可帮助捕获我们的分析未正确识别您在运行时需要的泛型的所有情况。对于这些情况,您将无法通过该代码路径获得最佳速度,因为需要进行合理数量的重定向才能使其正常工作。但是,如果您发现某个特定的热路径受到影响,那么让编译器为这些路径生成本机代码相对简单,方法是让我们在分析期间找到一些具有所需类型签名的存根代码。

一段时间以来,它一直是 .NET Native 运行时的一部分。您可以在this announcement 阅读有关它的信息。

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2013-11-06
    • 2010-09-07
    • 2010-11-10
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多