我在 linux 上使用带有 C# 的 .net 核心,缺少 lib System.Drawing

Posted

技术标签:

【中文标题】我在 linux 上使用带有 C# 的 .net 核心,缺少 lib System.Drawing【英文标题】:I am using .net core with C# on linux, lib System.Drawing is missing 【发布时间】:2017-11-09 17:41:13 【问题描述】:

Program.cs(1,14):错误 CS0234:类型或命名空间名称“绘图” 命名空间“系统”中不存在(您是否缺少程序集 参考?

有可能解决这个问题吗?或者如果我使用 C# 在 Linux 中开发,我不打算使用这个库?

【问题讨论】:

这个命名空间不是 .net core 的一部分 .NET Core 根本不存在(目前) 工作正在进行中。 github.com/dotnet/corefx/issues/20325 【参考方案1】:

2021:

引用https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only#recommended-action

要将这些 API 用于跨平台应用,请迁移到以下库之一:

ImageSharp SkiaSharp Microsoft.Maui.Graphics

您可以在短期内使用 System.Drawing,但请注意没有支持。

或者,您可以通过在 runtimeconfig.json 文件中将 System.Drawing.EnableUnixSupport 运行时配置开关设置为 true 来启用对非 Windows 平台的支持:

添加此配置开关是为了让严重依赖此包时间的跨平台应用迁移到更现代的库。但是,不会修复非 Windows 错误。此外,我们可能会在未来的版本中完全移除对非 Windows 平台的支持,即使您使用运行时配置开关启用它也是如此。

为了能够在 linux 机器上使用 System.Drawing,您可能还需要安装 @saman-azadi 和 @alex-from-jitbit 提到的 libgdiplus


2017:

System.Drawing 命名空间目前不是 corefx 的一部分,因为它依赖于 Windows 的 GDI+ 功能。

不过以后有plans支持。


但有多种选择:

CoreCompat.System.Drawing

CoreCompat.System.Drawing 是 System.Drawing 的 Mono 实现的 .NET Core 端口。与 .NET Framework 和 Mono 中的 System.Drawing 一样,CoreCompat.System.Drawing 也依赖于 Windows 上的 GDI+。因此,出于同样的原因,建议谨慎行事。

ImageSharp

ImageSharp 是一个全新的纯托管代码和跨平台图像处理库。它的性能不如依赖于本地操作系统特定依赖项的库,但它仍然非常合理。它唯一的依赖是 .NET 本身,这使得它非常便携:不需要安装额外的包,只需引用 ImageSharp 本身,就可以了。

Magick.NET

Magick.NET 是流行的 ImageMagick 库的 .NET 包装器。 ImageMagick 是一个开源的跨平台库,专注于图像质量,并提供非常广泛的受支持图像格式选择。它还支持与 ImageSharp 相同的 EXIF。

(Magick.NET 的 .NET Core 版本目前仅支持 Windows。)

SkiaSharp

SkiaSharp 是 Google 的 Skia 跨平台 2D 图形库的 .NET 包装器,由 Xamarin 团队维护。 SkiaSharp 现在与 .NET Core 兼容,而且速度非常快。

FreeImage-dotnet-core

这个库对于原生 FreeImage 库就像 Magick.NET 对于 ImageMagick:一个 .NET Core 包装器。它提供了很好的图像格式选择、良好的性能和良好的视觉质量。


Here 是上面提到的库的一些很好的例子和性能分析。

【讨论】:

如果您对 CoreCompat.System.Drawing 感兴趣,可以查看CoreCompat.System.Drawing.v2【参考方案2】:

在命令行运行以下命令

sudo apt-get install libgdiplus

sudo yum install -y libgdiplus-2.10-9.el7.x86_64

【讨论】:

【参考方案3】:

MS 已经发布了 System.Drawing.Common,它也可以在 Linux 上运行 https://www.nuget.org/packages/System.Drawing.Common/

更新:他们决定在 .NET 6 中将其设为“仅限 Windows”,该软件包将显示编译警告,因为它依赖于 libgdiplus,而这可能不会出现在某些 Linux 发行版 https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only

我们切换到 ImageSharp,因为它是唯一一个纯托管代码且非托管依赖项为零的图像处理库(与 SkiaSharp 或 MagickNET 不同)

【讨论】:

【参考方案4】:

您可以使用 Aspose.Drawing 库 - 完全托管和跨平台的 System.Drawing 的直接替代品。 (我是开发人员之一。)

【讨论】:

【参考方案5】:

对于那些试图在 linux 上使用 System.Drawing 的人: libgdiplus 在 linux 上导致严重的内存泄漏(在 ubuntu 20.04 上尝试过) 并且不应使用 (found here) ImageSharp 努力使用本机代码(传递内存指针)OpenCvSharp4 成为我的最终选择

【讨论】:

以上是关于我在 linux 上使用带有 C# 的 .net 核心,缺少 lib System.Drawing的主要内容,如果未能解决你的问题,请参考以下文章

是否可以设置 Visual Studio 2017,使其在远程 Linux 机器而不是本地机器上运行和调试 .NET Core C# 应用程序?

通过 C# .NET 应用程序调用时无法识别命令,但直接调用时有效

是否可以在 Linux 上使用 .Net Core 3.1 创建 C++/CLI 代码的 C# DLL

C# .NET Core websocket ssl 问题 - dh 密钥太小

使用 IdentityServer 和 C# 保护 API

使用 c# .net 发送带有图像的 GCM 推送通知(适用于 android 应用程序)