最近使用.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:在参考链接的文档中,还有几个其他的办法看起来也可能可以解决问题,不过我没有去测试了,有兴趣的可以试试看