.NET 6 System.Drawing.Common 运行时开关

Posted

技术标签:

【中文标题】.NET 6 System.Drawing.Common 运行时开关【英文标题】:.NET 6 System.Drawing.Common Runtime Switch 【发布时间】:2021-12-10 21:48:09 【问题描述】:

根据https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only System.Drawing.Common 在非 Windows 操作系统下不再支持,除非设置了运行时配置开关。我已经设置了 runtimeconfig.template.json 并看到了开关:

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

在 bin/Debug/net6.0 中的 .runtimeconfig.json 文件中

但是,当我使用 dotnet exec app.dll 在 linux 机器中运行应用程序时,我仍然会得到 PlatformNotSupportedException

【问题讨论】:

【参考方案1】:

以下内容对我有用。

将以下行添加到 .csproj 文件的 PropertyGroup 部分:

<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>

接下来在与您的项目文件相同的目录中创建一个名为 runtimeconfig.template.json 的文件,其中包含:


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

我使用了 dotnet publish 命令,它在我提供给 dotnet publish 命令的输出目录中创建了一个 [YourAppNameHere].runtimeconfig.json 文件。

对于我的 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
    
  

这行得通,但尝试遵循问题中链接到的页面上的文档却没有。我认为这是因为我在 runtimeconfig.template.json 文件中添加了“runtimeOptions”部分,但 dotnet publish 命令还添加了一个名为“runtimeOptions”的部分,这似乎阻止了运行时看到“System. Drawing.EnableUnixSupport”选项。

因此,我在 runtimeconfig.template.json 文件中排除了“runTimeOptions”部分,因为发布导致以下文件不起作用:


  "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”,我认为这会导致它在尝试按照问题链接中的文档进行操作时失败。

【讨论】:

嵌套的“runtimeOptions”是问题所在。 这太糟糕了,我从 DNX 时代就一直在使用 .net 核心,每次有新的更新时,他们都会做出一些糟糕的破坏性更改,需要对 csproj 和其他东西进行糟糕的添加才能使工作正常再次工作,这绝对令人沮丧。而且这个也是绝对没必要的。

以上是关于.NET 6 System.Drawing.Common 运行时开关的主要内容,如果未能解决你的问题,请参考以下文章

vs2017创建支持多框架(net4.6.1;net4.6.2;netstandard2.0;netcoreapp2.0)版本

使用.NET 6开发TodoList应用(12.1)——加餐 .NET 6中的HttpLogging简介

.NET 6 Preview 6 Released

使用 .NET 4.6.2 中的 HttpClientFactory

.NET 6使用.NET 6开发minimal api以及依赖注入的实现VS2022热重载和自动反编译功能的演示

C# 6.0 是不是适用于 .NET 4.0?