c# - 使用 /p:PublishSingleFile=true 标志发布时出错
问题描述
我正在尝试将我的程序压缩为单个可执行文件。我遵循此处指定的说明:https ://dotnetcoretutorials.com/2019/06/20/publishing-a-single-exe-file-in-net-core-3-0/
当我在没有 /p:PublishSingleFile=true 的情况下运行我的代码时,它可以工作,但不会生成单个文件(如预期的那样)。当我添加上述标志时,我得到以下信息:
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: The "GenerateBundle" task failed unexpectedly. [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: System.ArgumentException: Invalid input specification: Found multiple entries with the same BundleRelativePath [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: at Microsoft.NET.HostModel.Bundle.Bundler.GenerateBundle(IReadOnlyList`1 fileSpecs) [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: at Microsoft.NET.Build.Tasks.GenerateBundle.ExecuteCore() in /_/src/Tasks/Microsoft.NET.Build.Tasks/GenerateBundle.cs:line 36 [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: at Microsoft.NET.Build.Tasks.TaskBase.Execute() in /_/src/Tasks/Common/TaskBase.cs:line 47 [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute() [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
C:\Program Files\dotnet\sdk\3.0.100-preview7-012821\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(801,5): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask) [C:\Users\igorc\Work\ZConsole\ZConsole\ZConsole.csproj]
我认为这是一个环境问题,所以我创建了一个“HelloWorld”控制台应用程序,并在那里运行相同的脚本,它工作并生成了一个可执行文件。
所有项目均在 .NETCORE3.0 下编译。
这是我的 ZConsole.csproj 的样子:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<ApplicationIcon>logo.ico</ApplicationIcon>
<StartupObject>ZConsole.ZConsole</StartupObject>
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<RuntimeIdentifier>win10-x64</RuntimeIdentifier>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="log4net" Version="2.0.8" />
<PackageReference Include="log4net-loggly" Version="9.0.0" />
<PackageReference Include="Nancy" Version="2.0.0" />
<PackageReference Include="Nancy.Hosting.Self" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
<PackageReference Include="System.IO.Ports" Version="4.6.0-preview4.19114.5" />
<PackageReference Include="Topshelf" Version="4.2.1" />
<PackageReference Include="WebSocketSharp-NonPreRelease" Version="1.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ZWaveDll\BasicApplication\BasicApplication_netcore.csproj" />
<ProjectReference Include="..\ZWaveDll\Utils\Utils_netcore.csproj" />
<ProjectReference Include="..\ZWaveDll\ZWaveXml\ZWaveXml_netcore.csproj" />
<ProjectReference Include="..\ZWaveDll\ZWave\ZWave_netcore.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="AssemblyInfo.cs">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="App.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
谢谢您的帮助!
解决方案
为了调试这个问题,我发现取消选中发布选项中的单文件标志并检查输出目录中的库很有用。在我的具体情况下,我有两个程序集引用了多个相同的 COM 互操作库(IWshRuntimeLibrary 等)。我最终使用了引用库的嵌入互操作类型和复制本地标志,这样无论发生什么冲突,都不复存在了。
推荐阅读
- java - 如何将 android 应用程序 kotlin 连接到 Postgresql
- python - 为什么在使用 Python 计算时,Binet 公式的输出有小数?
- node.js - 如何使用 couchbase 在数据库中添加对象数组而不丢失其他数据
- android - Android - SurfaceView 中的奇怪崩溃
- reactjs - 使用情感 css 函数而不在输出类名称中暴露组件名称
- mysql - Mysql仅更新第一个唯一匹配
- django-models - 如何在我的 Django models.py 中自动制作缩略图?
- java - Firebase onDataChange 未执行
- python - Django urls.py 配置给出 404 页
- docker - 如何使在“nsenter”之后在 PID 命名空间中创建的进程可以被该命名空间杀死?