Система .NET 6.Рисование.Общий переключатель среды выполнения

#.net-6.0 #system.drawing.common

#.net-6.0 #system.drawing.common

Вопрос:

Согласно https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only Система.Рисование.Общий больше не поддерживается в ОС, отличной от Windows, ЕСЛИ не установлен переключатель конфигурации среды выполнения. Я настроил runtimeconfig.template.json и вижу переключатель:

 "runtimeOptions": {
      "configProperties": {
        "System.Drawing.EnableUnixSupport": true
      }
    }
 

внутри файла .runtimeconfig.json в bin/Debug/net6.0

Однако, когда я запускаю приложение в окне Linux, используя dotnet exec app.dll , я все равно получаю исключение PlatformNotSupportedException

Ответ №1:

Для меня сработало следующее.

Добавление следующей строки в файл .csproj в разделе PropertyGroup:

 <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
 

Затем создайте файл с именем runtimeconfig.template.json в том же каталоге, что и файл вашего проекта, содержащий:

 {
      "configProperties": {
         "System.Drawing.EnableUnixSupport": true
      }
}
 

Я использовал команду dotnet publish, которая создала файл [YourAppNameHere].runtimeconfig.json в выходном каталоге, который я предоставил команде dotnet publish.

Для моего asp.net проект, публикация привела к следующему [YourAppNameHere].runtimeconfig.jsonфайлу:

 {
  "runtimeOptions": {
    "tfm": "net6.0",
    "includedFrameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.1"
      },
      {
        "name": "Microsoft.AspNetCore.App",
        "version": "6.0.1"
      }
    ],
    "configProperties": {
      "System.Drawing.EnableUnixSupport": true,
      "System.GC.Server": true,
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
      "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
    }
  }
}
 

Это сработало, когда попытка следовать документации на странице, на которую дана ссылка в вопросе, не сработала. Я думаю, это потому, что я добавлял раздел «runtimeOptions» в файл runtimeconfig.template.json, но команда dotnet publish также добавляла раздел с именем «runtimeOptions», который, похоже, не позволил среде выполнения увидеть «System.Рисование.Включить опцию «Unixsupport».

По этой причине я исключил раздел «runTimeOptions» в моем файле runtimeconfig.template.json, поскольку публикация привела к следующему файлу, который не работал:

 {
  "runtimeOptions": {
    "tfm": "net6.0",
    "includedFrameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "6.0.1"
      },
      {
        "name": "Microsoft.AspNetCore.App",
        "version": "6.0.1"
      }
    ],
    "runtimeOptions": {
      "configProperties": {
        "System.Drawing.EnableUnixSupport": true
      }
    },
    "configProperties": {
      "System.GC.Server": true,
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
      "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
    }
  }
}
 

Обратите внимание на вложенные «runtimeOptions», которые, как я полагаю, приводили к сбою при попытке следовать документации по ссылке из вопроса.

Комментарии:

1. Проблема заключалась во вложенных «runtimeOptions».

2. Это отстой, я использую .net core с эпохи DNX, и каждый раз, когда появляется новое обновление, они вносят какие-то дерьмовые изменения, требующие дерьмового добавления в csproj и другие вещи, чтобы заставить то, что работало, снова работать, это абсолютно расстраивает. И это тоже абсолютно не нужно.

3. Это работает и в .Net Core 3.1. Мне пришлось обновить систему. Рисование. Общий для версии 6 по другой причине и не был уверен, сработает ли это, поскольку у него нет runtimeconfig.json файла, но если вы его создадите, он будет работать.