You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Linux下dotnet build构建.NET Framework项目报错,求可行性与修复方案

问题解答

我来帮你逐个理清这些问题:

1. 能不能在Linux下构建Windows控制台应用?

完全可以,但得分两种情况来看:

  • 如果你要构建的是**传统.NET Framework(比如你用的4.6.1)**的Windows控制台应用:Linux下可以借助Mono或者.NET Core的工具链完成构建,但需要先搞定对应框架版本的引用程序集。
  • 要是能把项目迁移到.NET Core/.NET 6+:这是更省心的跨平台方案,原生支持Linux构建和运行,不用依赖额外的兼容层。

2. 构建后会生成什么类型的文件?

  • 针对.NET Framework构建:会生成Windows平台的.exe文件,但这个文件不能直接在Linux下跑,得通过Mono来执行(比如敲mono YourApp.exe)。
  • 针对.NET Core/.NET 6+构建:默认生成跨平台的.dll文件,直接用dotnet YourApp.dll就能在Linux下运行;也可以通过dotnet publish -r linux-x64 --self-contained true命令生成Linux原生的可执行文件,不用提前装.NET Runtime就能跑。

3. 怎么修复你遇到的MSB3644错误?

你碰到的这个错误,核心原因是Linux上的.NET Core SDK默认不带.NET Framework的引用程序集,给你两个可行的解决办法:

办法一:通过Mono安装.NET Framework目标包

Mono提供了.NET Framework的引用程序集,以Ubuntu为例,步骤如下:

  1. 先安装Mono:
sudo apt update
sudo apt install mono-devel
  1. 安装完之后,重新运行你的构建命令:
dotnet build WorldServer.sln

这时候Build工具会自动找到Mono提供的.NET Framework 4.6.1引用程序集,错误应该就能解决了。

办法二:把项目迁移到.NET Core/.NET 6+(更推荐)

如果你的项目没有用到.NET Framework独有的API,强烈建议迁移到跨平台的.NET版本,步骤很简单:

  1. 打开WorldServer.csproj文件,找到<TargetFramework>节点,把原来的:
<TargetFramework>net461</TargetFramework>

改成:

<TargetFramework>net6.0</TargetFramework> <!-- 也可以选net7.0、net8.0这些更高版本 -->
  1. 检查项目里的NuGet包和代码,有没有依赖.NET Framework专属的部分(比如System.Drawing可以换成跨平台的ImageSharp,不过你是控制台应用,大概率没什么问题),替换成跨平台的替代方案。
  2. 最后重新运行构建命令就行:
dotnet build WorldServer.sln

这样构建出来的程序能直接在Linux下运行,后续维护也更方便。


内容的提问来源于stack exchange,提问作者Venelin

火山引擎 最新活动