如果可能,我将不胜感激,如果可能,请为以下问题提供帮助:我尝试通过命令行发布我的 .NET 5.0 控制台应用程序,因为我必须包含在 ansible 脚本中才能从 jenkins 构建和部署,并且当我尝试以下命令时:
dotnet publish --configuration Release -p:PublishReadyToRun=true -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true --runtime win-x86 --framework net5.0
我收到以下错误:
C:\Program Files\dotnet\sdk\5.0.102\Microsoft.Common.CurrentVersion.targets(2744,5): error : MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild. Please use the .NET Framework version of MSBuild. See https://aka.ms/msbuild/MSB4803 for further details. [I:\workspaceVS\net50\ConsoleCoreApp1\ConsoleCoreApp1.csproj]
从我目前所读到的内容来看,这是因为 dotnet 无法发布带有 COM 引用的项目。我有一个 .dll 文件作为 API,用于访问远程服务器以将数据发送到我的机器。我首先需要 regsvr32 这个 .dll 文件,然后我可以在我的项目中引用它。
如果我尝试使用 VS2019 的发布功能,它可以工作,但我不想在我的 AWS 机器上安装 VS2019,我只想安装一个像 MSBuild 这样的工具,它将通过运行命令来构建和发布我的应用程序来自 ansible playbook(所以不要打开 VS2019 并点击按钮来发布应用)。
解决方案是使用 MSBuild。但是如何......我不知道。
现在,在我尝试以下命令之后:
dotnet msbuild ConsoleCoreApp1.csproj /t:publish /p:Configuration=Release /p:TargetFramework=net5.0 /p:SelfContained=true /p:PublishTrimmed=True /p:PublishReadyToRun=True /p:RuntimeIdentifier=win-x86 /p:PublishDir=bin\Release
我遇到了同样的错误:
C:\Program Files\dotnet\sdk\5.0.102\Microsoft.Common.CurrentVersion.targets(2744,5): error : MSB4803: The task "ResolveComReference" is not supported on the .NET Core version of MSBuild. Please use the .NET Framework version of MSBuild. See https://aka.ms/msbuild/MSB4803 for further details. [I:\workspaceVS\net50\ConsoleCoreApp1\ConsoleCoreApp1.csproj]
解决方案是直接使用 MSBuild,例如:
& 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe' /t:publish /p:Configuration=Release /p:TargetFramework=net5.0 /p:SelfContained=true /p:PublishTrimmed=True /p:PublishReadyToRun=True /p:RuntimeIdentifier=win-x86 /p:PublishDir=bin\Release
这是可行的,但问题在于它不会将应用程序发布为单个 .exe 应用程序 :(
有什么想法吗?谢谢!
-------------------- 编辑--------------------
什么有效:
什么不起作用:
我将 msbuild 添加到路径中,现在,如果我只运行以下命令
msbuild /t:publish /p:Configuration=Release /p:TargetFramework=net5.0
我得到一个有效的应用程序,但是当我尝试运行它时,我得到:
Unhandled exception. System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {CE92C3B9-9A93-40E1-85AB-6A49170AEF7F} failed due to the following error: 80040154 Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)).
at ConsoleApp1.Service1..ctor(String[] args) in I:\workspaceVS\net50\ConsoleCoreApp1\Service1.cs:line 24
at ConsoleCoreApp1.Program.Main(String[] args) in I:\workspaceVS\net50\ConsoleCoreApp1\Program.cs:line 7
这是因为我的 .dll API 只喜欢 win32 位,我需要使用标志 win-x86 编译它。
但是使用 msbuild /t:publish /p:Configuration=Release /p:TargetFramework=net5.0 /p:SelfContained=true /p:PublishTrimmed=True /p:PublishReadyToRun=True /p:RuntimeIdentifier=win-x86 -p:PublishSingleFile=true
发布它会导致以下错误:
Build FAILED.
"I:\workspaceVS\net50\ConsoleCoreApp1\ConsoleCoreApp1.csproj" (publish target) (1) ->
(ResolvePackageAssets target) ->
C:\Program Files\dotnet\sdk\5.0.102\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(241,5): error NETSDK1047: A
ssets file 'I:\workspaceVS\net50\ConsoleCoreApp1\obj\project.assets.json' doesn't have a target for 'net5.0/win-x86'. Ensure that restore has
run and that you have included 'net5.0' in the TargetFrameworks for your project. You may also need to include 'win-x86' in your project's Run
timeIdentifiers.
好的,通过添加 <RuntimeIdentifier>win-x86</RuntimeIdentifier>
修改 ConsoleCoreApp1.csproject 文件设法解决了最后一个错误的问题:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<RuntimeIdentifier>win-x86</RuntimeIdentifier>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<Prefer32Bit>true</Prefer32Bit>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
<Prefer32Bit>true</Prefer32Bit>
<PlatformTarget>x86</PlatformTarget>
</PropertyGroup>
<ItemGroup>
<COMReference Include="GV8APILib.dll">
<WrapperTool>tlbimp</WrapperTool>
<VersionMinor>1</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>0a67e301-3ecb-47be-bba9-dc67ff219358</Guid>
<Lcid>0</Lcid>
<Isolated>false</Isolated>
</COMReference>
</ItemGroup>
<ItemGroup>
<Folder Include="FileReading\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />
<PackageReference Include="NLog" Version="4.7.7" />
<PackageReference Include="NLog.Config" Version="4.7.7" />
<PackageReference Include="NLog.Schema" Version="4.7.7" />
<PackageReference Include="RabbitMQ.Client" Version="6.2.1" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="5.0.0" />
<PackageReference Include="System.Text.Json" Version="5.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="NLog.xsd">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Others\___.key">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Others\___.p12">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Others\rmq___.uat.key">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Others\rmq___.uat.p12">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Others\rmq___.uat.pem">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\AllOrders.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\Companies.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\DealsOrders - RequestAllDefinitions.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\DealsOrders.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\RequestHistTrades.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\InstrumentDefinitionsQuery.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\Orders.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\QueryOutput.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="XMLRequest\SequenceItemsQuery.xml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Libraries\___.GvApi.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Libraries\System.Threading.Tasks.Dataflow.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Libraries\___.GvApi.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Libraries\___.GvApi.Managed.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
不幸的是,现在获取 1 个包含所有内容的单个 .exe 文件的问题仍然存在。
谢谢和问候!
答案 0 :(得分:1)
实际上,正如你所说,使用msbuild -t:publish
是最好的方式,而dotnet publish
无法处理COM引用。
并且您应该更改为使用命令行,对您的命令行进行了一些更改:
msbuild /t:publish /p:Configuration=Release /p:TargetFramework=net5.0 /p:SelfContained=true /p:PublishTrimmed=True /p:PublishReadyToRun=True /p:RuntimeIdentifier=win-x86 -p:PublishSingleFile=true
您必须添加 -p:PublishSingleFile=true
。
或者你必须参考this similar issue的建议。