Propriedade “RuntimeInformation.OSDescription” do .NET Core (e implementação de suporte a .Net Core Multi-Platform em geral)

Oct 05 2020

Depois de investir cerca de 8 horas em pesquisas intermináveis ​​no google, tenho que perguntar a vocês aqui da comunidade. Por favor, ajude :-)

Este é o Q teórico, e quero entender como essa "mágica" implementada pelo Microsoft .Net Core CLR. Embora eu entenda como implementar meu próprio código para poder trabalhar em diferentes sistemas operacionais (usando Interface e P / Invoke de uma plataforma específica) a partir da resposta:https://stackoverflow.com/a/52297584/10696080

Não entendo como as DLLs .Net Core CLR implementam a mesma funcionalidade. Para "RuntimeInformation.OSDescription" ou "RuntimeInformation.IsOSPlatform", por exemplo.

Olhando o código-fonte da classe .Net Core RuntimeInformation, parece que não é implementado por Interface e P / Invorke, mas por algum método misterioso.

Minhas descobertas até aqui:

  1. Eu encontro uma pergunta mais geral: Implementação da estrutura subjacente do .Net Core Multi-Platform Mas não responde à minha pergunta.

  2. O site da microsoft também não explica isso

  3. A decompilação de System.Runtime.InteropServices.RuntimeInformation.dll revela apenas propriedades estáticas vazias

Pergunta: Por favor, aconselhe onde posso procurar a explicação de como as DLLs do .Net Core CLR implementam o suporte multiplataforma (ou mais especificamente, como funciona o RuntimeInformation.OSDescription)

Respostas

andreyk2Hohlov Oct 08 2020 at 12:28

.Net Core CLR DLLs implementa suporte multiplataforma implementado por:

  1. O código-fonte do .NET Core tem diretivas específicas de pré-processador do sistema operacional:

    * # se TARGET_WINDOWS ...

    #elif TARGET_OSX ...

    #elif TARGET_UNIX ... *

  2. A compilação condicional é feita e a DLL compilada separadamente para cada plataforma de destino. Portanto, existem algumas versões de DLLs do .NET Core (no SDK do .NET Core)

  3. Durante a implantação do aplicativo:

    A. Implementação dependente do Fremework . Seu aplicativo usa a versão DLL específica do sistema operacional, que já está instalada na máquina de destino (no tempo de execução do .NET Core)

    B. Implantação independente . DLL específico da plataforma obtido do SDK e incluído na pasta do aplicativo