繁体   English   中英

如何发布引用另一个可执行文件的独立 C# 可执行文件?

[英]How to publish a self-contained C# executable that references another executable?

我有两个 C# .NET 5 个项目,我们称它们为 A 和 B。两者都是可执行文件(不是 DLL)。 项目 A 引用项目 B。我想将项目 A 发布为独立的可执行文件(尽管不是单个文件,如果重要的话)。 我正在使用此命令启动发布过程:

do.net publish A.csproj -c Release --self-contained -r win-x64 /p:PublishTrimmed=true /p:PublishReadyToRun=true

但是,这在尝试构建项目 B 时会产生以下错误(这是必需的,因为项目 A 引用了它):

error.NETSDK1031: It is not supported to build or publish a self-contained application without specifying a RuntimeIdentifier. You must either specify a RuntimeIdentifier or set SelfContained to false.

但如您所见,(我认为?)使用-r win-x64指定运行时标识符。 我猜我在命令行上指定的运行时标识符在构建项目 B 时没有通过。如何在不禁用 SelfContained 的情况下解决这个问题?

我的 do.net 版本是:

dotnet --version
5.0.400

编辑:我不想将<RuntimeIdentifier>win-x64</RuntimeIdentifier>放在我的项目文件中,因为我需要为多个不同的运行时构建,并且我希望能够通过命令行控制它。

感谢Github 问题中的一些评论,我能够弄清楚如何让它编译:

  1. 从命令行中删除--self-contained标志。 (根据文档,“如果指定了运行时标识符并且项目是可执行项目(而不是库项目),则默认值为真。”)

  2. 添加/p:ValidateExecutableReferencesMatchSelfContained=false到命令行。 这是抑制错误所必需的:“引用的项目‘B.csproj’是一个非独立的可执行文件。独立的可执行文件不能引用非独立的可执行文件。”

  3. 如果您希望能够运行在构建项目 A 时生成的B.exe文件,则需要将适当的B.deps.json文件添加到构建 output 中。这是我发现的最简单的方法是制作 B 的独立自包含构建,然后简单地从中复制B.deps.json文件。 (如果您像我一样使用 PublishTrimmed 进行构建,那么您可能需要将条目添加到您的TrimmerRoots.xml文件中,以防止项目 B 所需的代码从 output 中删除。)

完成这两件事后,我的项目现在正在构建并成功运行。 我已经验证即使在没有安装 .NET 运行时的机器上它仍然可以工作,因此构建确实是独立的。

我也有库、控制台和 UI 项目并且有同样的问题。 我将控制台项目引用到 UI 中,以便在开发和发布时复制到 UI 的 output 文件夹,但最好的解决方案是取消引用控制台项目并将两者发布到同一个文件夹

dotnet publish MyConsole -o "publish/myRelease" -c Release -r xxx-xxx -p:PublishReadyToRun=true --self-contained
dotnet publish MyUI-o "publish/myRelease" -c Release -r xxx-xxx -p:PublishReadyToRun=true --self-contained

我的构建脚本:

  1. https://github.com/sn4k3/UVtools/blob/master/build/createRelease.ps1
  2. https://github.com/sn4k3/UVtools/blob/master/build/createRelease.sh

我只在 windows 上调用 ps1 脚本,让 WSL 为其他人执行 rest。不幸的是,在 linux 上编译为 windows 会生成一个“坏”.exe

注意:如果您希望在开发过程中复制其他项目,例如:Visual Studio,您可以在构建条件下创建一个简单的复制命令。 这将解决这两个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM