C# .NET Core“;运行时信息.OSDescription“;隐藏的属性(以及通常的.Net核心多平台支持实现)

C# .NET Core“;运行时信息.OSDescription“;隐藏的属性(以及通常的.Net核心多平台支持实现),c#,C#,在花了8个小时在谷歌上没完没了地搜索之后,我得问问你们社区里的人。请帮忙:-) 这是一个理论问题,我想了解微软.Net核心CLR是如何实现这个“魔法”的。虽然我了解如何实现自己的代码,以便能够在不同的操作系统上工作(通过使用特定平台的接口和P/Invoke) 答案如下: 我不明白.Net核心CLR DLL如何实现相同的功能。例如“RuntimeInformation.OSDescription”或“RuntimeInformation.IsOSPlatform” 通过查看.Net核心运行时信息

在花了8个小时在谷歌上没完没了地搜索之后,我得问问你们社区里的人。请帮忙:-)

这是一个理论问题,我想了解微软.Net核心CLR是如何实现这个“魔法”的。虽然我了解如何实现自己的代码,以便能够在不同的操作系统上工作(通过使用特定平台的接口和P/Invoke) 答案如下:

我不明白.Net核心CLR DLL如何实现相同的功能。例如“RuntimeInformation.OSDescription”或“RuntimeInformation.IsOSPlatform”

通过查看.Net核心运行时信息类的 它似乎不是通过接口和P/Invorke实现的,而是通过某种神秘的方法实现的

到目前为止,我的发现是:

  • 我发现了一个更普遍的问题: 但这不是我的问题

  • 政府也没有解释这一点

  • 反编译System.Runtime.InteropServices.RuntimeInformation.dll只显示空的静态属性


  • 问题:请告知我在哪里可以找到.Net Core CLR DLL如何实现多平台支持的说明(更具体地说,是RuntimeInformation.OSDescription如何工作的)

    。Net Core CLR DLL实现多平台支持的方法是:

  • .NET核心源代码具有特定于目标的操作系统预处理器指令:

    *#如果目标为WINDOWS

    #elif TARGET_OSX

    #elif TARGET_UNIX *

  • 对每个目标平台分别进行条件编译和DLL编译。因此有一些版本的.NET核心DLL(在.NET核心SDK中)

  • 部署应用程序时:

    A.依赖于Fremework的部署。您的应用程序使用特定于操作系统的DLL版本,该版本已安装在目标计算机上(在.NET核心运行时中)

    B.自包含式部署。特定于平台的DLL取自SDK并包含在应用程序文件夹中


  • 具体来说,对于运行时信息,代码是。此DLL具有特定于平台的版本,即针对每个目标平台单独编译。唯一神奇的是编译器标志,它在特定于平台的版本中包含不同的代码。我怀疑您的反编译是一个只包含公共成员元数据的版本。@MikeZboray,谢谢!这是有道理的!那么,如果RuntimeInformation.dll有一些特定于平台的版本,CLR如何知道加载正确的版本?我是说这些信息存储在哪里?在CLR的内部代码中?假设您谈论的是一个应用程序,在某个点上,计算机上运行的是平台相关的代码。您发布了应用程序的依赖于框架的版本,该版本使用目标计算机上安装的版本(即,计算机上有RuntimeInformation.dll),或者您使用的是包含应用程序文件夹中依赖于平台的组件的自含版本(正确版本的运行时信息随应用程序一起提供)。如果您只提供DLL,引用将包含在元数据中,这些元数据将由下游应用程序解析。@MikeZboray,我知道了。非常感谢。是的,我是指1-rst选项(应用程序的框架相关版本,使用目标计算机上安装的版本)