.NET Core 2.0+log4net应用Ubuntu运行及Windows打包报错求助
我之前也碰到过类似的跨平台部署和依赖冲突问题,结合你的情况,给你梳理几个针对性的解决思路:
一、搞定Windows下打包的NU1605包降级错误
NU1605这个错误本质是Windows环境下,针对Ubuntu 14.04的runtime进行依赖还原时,项目引用的包版本和目标runtime要求的版本不兼容,导致自动降级。直接硬引用包没用的话,可以试试这几步:
修改项目文件强制对齐runtime依赖
打开你的.csproj文件,在<PropertyGroup>节点里添加以下配置,明确指定目标运行时并强制按runtime还原依赖:<RuntimeIdentifiers>ubuntu.14.04-x64;win10-x64</RuntimeIdentifiers> <RestoreForceRuntimeSpecific>true</RestoreForceRuntimeSpecific>锁定冲突包的版本为runtime兼容版
在<ItemGroup>里把那些提示降级的包(比如System.Runtime.Extensions、System.Runtime.InteropServices)明确指定为降级后的版本(也就是4.1.0),这样就能避免依赖解析时的自动降级冲突:<PackageReference Include="System.Runtime.Extensions" Version="4.1.0" /> <PackageReference Include="System.Runtime.InteropServices" Version="4.1.0" />强制针对目标runtime还原依赖
保存项目文件后,在Windows的命令行里执行:dotnet restore --runtime ubuntu.14.04-x64等还原完成后再重新执行打包命令:
dotnet publish -c Release -r ubuntu.14.04-x64
二、解决Ubuntu 14.04上发布后应用无法运行的问题
Ubuntu 14.04的glibc版本比较老(2.19),而.NET Core 2.0对系统库有一定要求,加上log4net的配置可能没同步到位,你可以按以下步骤排查:
安装兼容的.NET Core Runtime
不要只装SDK,确保Ubuntu上安装了.NET Core 2.0.x的最新补丁版Runtime(比如2.0.9,对旧glibc兼容性更好),执行以下命令安装:curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main" > /etc/apt/sources.list.d/dotnetdev.list' sudo apt-get update sudo apt-get install dotnet-runtime-2.0.9确保log4net配置文件被正确发布
检查你的.csproj里有没有把log4net的配置文件设置为复制到输出目录,不然发布后找不到配置文件会导致启动失败:<None Include="log4net.config"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None>同时确认代码里正确加载了配置,比如在
Program.cs开头加上:log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));查看详细错误日志定位问题
如果还是启动失败,直接运行程序时加上详细日志参数:./YourAppName --verbosity detailed或者查看系统日志排查:
sudo journalctl -xe | grep YourAppName
三、终极方案:自包含部署
如果上面的方法都搞不定,试试打包成自包含部署包,这样会把.NET Core Runtime一起打包进去,完全不依赖系统安装的runtime,兼容性更好:
在Windows下执行打包命令:
dotnet publish -c Release -r ubuntu.14.04-x64 --self-contained true
然后把整个发布目录复制到Ubuntu 14.04上,给主程序加执行权限后运行:
chmod +x ./YourAppName ./YourAppName
内容的提问来源于stack exchange,提问作者feffe

