.NET 解决Linux下Couldn‘t find a valid ICU package installed on the system异常的问题

        最近使用.NET发布独立的Linux x64程序,在CentOS7.9的最小化安装系统上运行,结果运行不了,启动就报异常“Process terminated. Couldn't find a valid ICU package installed on the system. Please install libicu (or icu-libs) using your package manager and try again. Alternatively you can set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support. Please see https://aka.ms/dotnet-missing-libicu for more information.”

        在网上搜索了一下,这个是.NET 5.0及以上版本进行国际化的一个问题,需要libicu的支持,网上找到2个解决方案,确实都能解决问题,但都有一点点缺陷。

        第1个解决办法是修改项目的csproj文件,将System.Globalization.Invariant设为true,也就是放弃对国际化的支持,这样就不会受到这个异常的影响了。我一开始使用的这个解决办法,但是后来遇到了一个问题,就是我用程序去连某个SQL SERVER的时候,报异常了,说必须启用对国际化的支持才能读取,我不想发布多个版本,遂放弃。

        第2个解决办法是在操作系统中安装libicu,这个也可以解决问题,但我的程序的部署环境多为无外网、无yum等源的环境,离线安装十分不方便,所以我也不想使用这种解决方案。

        于是我一直在网上寻找,最终还是在微软的官网找到了完全独立的解决方案,不依赖外物,经过测试,可以成功运行。

参考链接:全球化和 ICU - .NET | Microsoft Learn

        第1步:给项目安装NUGET包Microsoft.ICU.ICU4C.Runtime,目前最新版是72.1.0.3,记住这个版本号

        第2步:编辑项目csproj文件,在根节点下加入如下代码,其中的Value需要与上面安装的NUGET包版本号一致

<ItemGroup>
	<RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="72.1.0.3"/>
</ItemGroup>

        第3步:以独立模式重新发布程序,发布后的程序中会多出几个icu相关的库文件,即可在Linux上运行了

 

PS:在参考链接的文档中,还有几个其他的办法看起来也可能可以解决问题,不过我没有去测试了,有兴趣的可以试试看 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值