我有两个 C# .NET 5 项目,我们称它们为 A 和 B。两者都是可执行文件(不是 DLL)。项目 A 引用项目 B。我想将项目 A 作为自包含的可执行文件发布(尽管不是单文件,如果这很重要)。我正在使用此命令启动发布过程:
dotnet 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 的情况下解决这个问题?
我的 dotnet 版本是:
dotnet --version
5.0.400
Run Code Online (Sandbox Code Playgroud)
编辑:我不想放入<RuntimeIdentifier>win-x64</RuntimeIdentifier>我的项目文件,因为我需要为多个不同的运行时构建,并且我希望能够通过命令行控制它。
感谢这个 Github 问题中的一些评论,我能够弄清楚如何编译它:
--self-contained从命令行中删除该标志。(根据文档,“如果指定了运行时标识符并且该项目是可执行项目(而不是库项目),则默认值为 true。”)
添加/p:ValidateExecutableReferencesMatchSelfContained=false到命令行。这是为了抑制错误:“引用的项目‘B.csproj’是非独立可执行文件。独立可执行文件无法引用非独立可执行文件。”
如果您希望能够运行B.exe构建项目 A 时生成的文件,则需要将适当的B.deps.json文件添加到构建输出。我发现最简单的方法是制作一个独立的 B 版本,然后简单地从中复制文件B.deps.json。(如果您像我一样使用 PublishTrimmed 进行构建,那么您可能需要在TrimmerRoots.xml文件中添加条目,以防止项目 B 所需的代码从输出中被修剪。)
完成这两件事后,我的项目现在已成功构建并运行。我已经验证即使在没有安装 .NET 运行时的机器上它仍然可以工作,因此构建确实是独立的。
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |