进行.net 6.0跨平台开发

利用Visual Studio 2022先创建一个基于.net 6.0的控制台程序,代码就利用默认的打印Hello world。编译,会得到工程名.exe和工程名.dll。
按照参考文章的说法,这个工程名.dll实际上已经可以跨平台运行了。于是乎找台ubuntu机器测试一下

在一台ubuntu 18.04的虚拟机上,先按照以下步骤,安装.net runtime
wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update && sudo apt-get install -y dotnet-runtime-6.0

直接把工程名.dll拷贝到linux上,用dotnet命令运行会报错,缺少 工程名.deps.json,以及 工程名.runtimeconfig.json。把 .deps.json 和 .runtimeconfig.json 都放到dll相同目录中,就可以用 dotnet 命令运行此dll,得到 Hello world 的输出结果。

接着,研究一下如果这个执行程序还依赖其他dll会是什么情况。用NuGet加一个最简单的 Newtonsoft.Json

using Newtonsoft.Json.Linq;

JObject staff = new JObject();
staff.Add(new JProperty("name", "Tom"));
staff.Add(new JProperty("age", 33));

Console.WriteLine(staff.ToString());

编译完,可以看到 工程名.deps.json 中的内容发生了变化,dependencies多了Newtonsoft.Json,而libraries中也有 Newtonsoft.Json 的版本信息描述。试着不把 Newtonsoft.Json.dll 拷贝到linux,则运行时会报错 "Could not load file",看来dotnet也没有自动下载依赖项的功能。Newtonsoft.Json.dll 也一同拷贝到 工程.dll 同一目录,则运行正常了。

按照参考资料,.net还可以打包成不依赖.net运行时的单独执行程序。编辑工程目录下的csproj文件,在PropertyGroup属性下添加一行RuntimeIdentifiers


    ...
    win10-x64;ubuntu.18.04-x64

进入命令行,进入工程所在目录,运行 dotnet publish。结果似乎只在 bin\Debug\net6.0\publish 目录生成了 win10 版本的exe和dll,和直接Visual studio运行结果差不多一样。只有运行了 dotnet publish -r ubuntu.18.04-x64,才在 bin\Debug\net6.0\ubuntu.18.04-x64\publish\ 生成了不一样的东西。publish目录一共60多兆,包含了若干so库和很多的.net dll。把整个目录都拷贝到Linux环境,给主程序赋予执行权限,也很顺利地运行了起来。

参考
https://opensource.com/article/17/5/cross-platform-console-apps
https://learn.microsoft.com/en-us/dotnet/core/install/linux-ubuntu

你可能感兴趣的:(进行.net 6.0跨平台开发)