Using MSBuild.exe to release a net5.0 console application because dotnet not working

1

I would appreciate please some help if possible with the following problem : I try to publish my .NET 5.0 Console app via the command line, because I have to included in ansible scripts to be able to build and deploy from jenkins, and when i try the following command :

dotnet publish --configuration Release -p:PublishReadyToRun=true -p:PublishSingleFile=true -p:PublishTrimmed=true --self-contained true --runtime win-x86 --framework net5.0

I get the following error:

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]

From what I've read so far this comes from the fact that dotnet is not able to publish projects with COM references. I have a .dll file as an API for accessing a remote server for getting data to my machine. I need first to regsvr32 this .dll file and then I can reference it in my project.

If I try to use the publish feature from VS2019 it works, but I don't want VS2019 on my machine on AWS, i want just to install a tool like MSBuild, which will build and release my app by running a command from an ansible playbook (so not opening VS2019 and clicking buttons to get the app published).

The solution is to use MSBuild. But how ... I don't know.

Now, after I try the following command :

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

I get the same error :

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]

The solution would be to use MSBuild directly, like :

& '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

And this works, with the problem that it does not publish the application as a single .exe app :(

Any ideas ? Thanks !

-------------------- EDIT --------------------

What works :

enter image description here

What does not work :

I added msbuild to the path and now, if I just run the following command msbuild /t:publish /p:Configuration=Release /p:TargetFramework=net5.0 I get a valid application but when I try to run it I get :

    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

This is from the fact that my .dll API likes only win32 bits and i need to compile it using the flag win-x86.

But publishing it by with 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 results in the following error :

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.

Ok, managed to solve the problem with the last error by modifying the ConsoleCoreApp1.csproject file by adding <RuntimeIdentifier>win-x86</RuntimeIdentifier>:

<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>

The problem of now getting 1 single .exe file containing everything is still there unfortunately.

Thanks & regards !

c#
.net
msbuild
visual-studio-2019
asked on Stack Overflow Feb 9, 2021 by R13mus • edited Feb 24, 2021 by R13mus

1 Answer

1

Actually, as you said, use msbuild -t:publish is the best way and dotnet publish cannot handle COM Reference.

And you should change to use command line, a bit change was made to your command line:

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

You have to add -p:PublishSingleFile=true.

Or you have to refer to the suggestion from this similar issue.

answered on Stack Overflow Feb 10, 2021 by Perry Qian-MSFT

User contributions licensed under CC BY-SA 3.0