Asp.Net Core使用System.Drawing.Common部署到docker报错问题

本文记录了Asp.NetCore2.1在Docker容器中使用System.Drawing.Common进行绘图时遇到的问题及解决方案,包括创建libdl.so软链接、安装libgdiplus和配置字体显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 详细报错

Unable to load shared library 'libdl' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibdl: cannot open shared object file: No such file or directory

Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能。但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心的,本文记录这些问题,希望帮到有需要的人

解决:

1.1 建立libdl.so 的软连接

参考:https://q.cnblogs.com/q/107946/

ln -s /lib/x86_64-linux-gnu/libdl.so.2  /lib/x86_64-linux-gnu/libdl.so

1.2 找不到libgdiplus

参考:https://q.cnblogs.com/q/103863/

apt-get update

apt-get install -y --allow-unauthenticated libgdiplus

1.3 汉字没有显示

把本地字体上传到服务器/usr/share/fonts下

cd /usr/share/fonts/

cd winfonts/

apt-get install xfonts-utils

mkfontscale 

mkfontdir 

cat fonts.scale 

fc-list :lang=zh-cn

解决!!!

 

<think>好的,我现在需要帮助用户解决关于.NET版本选择的问题。用户提到在创建项目时,只能看到.NET 8.0和9.0,而原本想选旧版本如.NET Core 3.1或.NET 5,但找不到。用户还询问.NET 8是否完全兼容之前的版本。 首先,我需要确认为什么Visual Studio或其他工具不显示旧版本。可能的原因是用户安装的SDK只包括8.0和9.0预览版,或者旧版本未安装。微软通常会在新版本发布后,旧版本的支持结束后不再默认包含在安装选项中。例如,.NET Core 3.1已经于2022年12月结束支持,.NET 5则在2022年5月结束支持,所以VS可能默认隐藏这些不受支持的版本。 接下来,用户想知道.NET 8是否完全兼容之前的版本。根据微软的政策,每个主要版本会有一些破坏性更改,但大多数情况下,升级需要做一些调整。例如,从.NET Core 3.1到.NET 5/6会有变化,ASP.NET Core中的某些API可能被弃用或替换。因此,完全兼容的可能性不大,但微软提供升级工具和文档帮助迁移。 然后,用户可能需要具体步骤来安装旧版本。应该引导他们到官方网站下载旧版SDK,并修改项目文件的目标框架。同时,提醒用户旧版本的安全风险,以及长期支持的重要性。 最后,总结建议用户尽量使用新版本,除非有特定需求必须用旧版,并推荐使用升级助手工具来迁移项目。</think>--- ### **1. 核心原因解释** **这是微软的版本策略所致**,主要因素如下: | 关键点 | 说明 | |-----------------------|--------------------------------------------------------------------| | **生命周期终结** | .NET Core 3.1 已于2022年12月停止支持,.NET 5 于2022年5月终止支持 | | **SDK自动过滤** | Visual Studio 默认隐藏**已终止支持**的旧版本,避免用户误选不安全版本 | | **新版本聚焦** | 微软强制开发者使用最新LTS(长期支持版),目前.NET 8是LTS,.NET 9是预览版 | --- ### **2. 手动启用旧版本的方法** #### **步骤1:安装旧版SDK** - 访问官方下载页:[.NET历史版本下载](https://dotnet.microsoft.com/download/dotnet) - 手动安装需要的版本(如.NET Core 3.1或.NET 5) #### **步骤2:修改Visual Studio筛选器** ```xml <!-- 修改项目模板的约束条件(需管理员权限) --> <!-- 路径:C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.dotnet.common.projecttemplates.8.0.0xxx.nupkg --> <!-- 查找并修改支持的TargetFramework版本范围 --> ``` #### **步骤3:创建项目后手动修改目标框架** ```xml <!-- 修改.csproj文件 --> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <!-- 或 net5.0 --> </PropertyGroup> ``` --- ### **3. .NET 8兼容性分析** #### **兼容性层级** | 兼容类型 | 支持情况 | |---------------|------------------------------------------------------------------------| | **二进制兼容** | 大部分.NET Core 3.1/5/6/7的DLL可直接运行 | | **API兼容** | 90%以上API保持兼容,但存在**破坏性变更**(如:`System.Drawing` 的跨平台限制)| | **行为兼容** | 运行时差异需注意(例如:GC策略、JIT优化差异) | #### **常见不兼容场景** ```csharp // 案例1:.NET 5中可用的API在.NET 8已被移除 // .NET 5: services.AddControllersWithViews().AddNewtonsoftJson(); // .NET 8需改用: services.AddControllersWithViews().AddJsonOptions(...); // 案例2:跨平台图形库限制 // 旧版Windows专用代码: using System.Drawing.Printing; // 在Linux/macOS会报错 ``` --- ### **4. 版本升级建议策略** #### **迁移优先级评估** | 项目类型 | 升级建议 | |---------------|------------------------------------------------------------------------| | 新项目 | **强制使用.NET 8**,无需考虑旧版 | | 维护中的项目 | 参考[.NET Upgrade Assistant](https://aka.ms/dotnet-upgrade-assistant) | | 遗留系统 | 保持原有框架,通过**TargetFramework多目标**渐进升级 | #### **多目标配置示例** ```xml <!-- 同时支持.NET Core 3.1和.NET 8 --> <PropertyGroup> <TargetFrameworks>netcoreapp3.1;net8.0</TargetFrameworks> </PropertyGroup> ``` --- ### **5. 关键破坏性变更清单** 从旧版本升级时需特别注意: 1. **加密算法变更** - `SHA1`默认禁用,需手动启用 - `RSA.EncryptValue`/`DecryptValue`被移除 2. **HTTP协议栈** - `HttpClient`默认使用SocketsHttpHandler - 旧版WinHttpHandler需显式配置 3. **全球化模式** - 默认启用ICU库,`NLS`模式需配置: ```xml <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" /> ``` 4. **Windows Forms限制** - 部分GDI+调用需添加`Microsoft.Windows.Compatibility`包 --- ### **6. 兼容性验证工具** ```bash # 使用API兼容性检查器 dotnet add package Microsoft.DotNet.ApiCompat.Tool --version 8.0.0 dotnet apicompat check --left-assembly old.dll --right-assembly new.dll # 输出示例: [Error] API break: Type 'System.Drawing.Printing.PrinterSettings' removed [Warning] Behavior change: 'File.ReadAllText' now throws different异常类型 ``` --- ### **7. 版本支持时间表** | 版本 | 发布日期 | 主流支持结束 | 安全补丁结束 | |----------------|------------|--------------|--------------| | .NET Core 3.1 | 2019-12 | 2022-12 | 已终止 | | .NET 5 | 2020-11 | 2022-05 | 已终止 | | .NET 6 (LTS) | 2021-11 | 2024-11 | 2024-11 | | .NET 8 (LTS) | 2023-11 | 2026-11 | 2026-11 | --- ### **总结建议** 1. **新项目必须用.NET 8**:性能优化、安全更新、功能完备性远超旧版 2. **旧项目有条件升级**:使用升级助手逐步迁移,重点关注破坏性变更 3. **历史项目维护方案**:通过Docker容器锁定旧版运行时环境 4. **学习资源转向**:微软官方文档已全面转向.NET 8,旧版资料可能过时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值