Reduzieren Sie die Größe der .NET 5.0-Konsolenanwendung

Ziel-Framework-Moniker

Lass uns kennenlernen. In .NET 5.0 reicht es für die Verwendung von Windows Forms oder WPF nicht aus, nur net5.0 anzugeben:





<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
  <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
      
      



Beim Versuch, Windows Forms oder WPF zu verwenden, wird der Fehler angezeigt





C:\Program Files\dotnet\sdk\5.0.201\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.targets(369,5): error NETSDK1136: The target platform must be set to Windows (usually by including '-windows' in the TargetFramework property) when using Windows Forms or WPF, or referencing projects or packages that do so.
      
      



Die Lösung besteht, wie der Fehler andeutet, darin, den Ziel-Framework-Moniker anzugeben





<PropertyGroup>
  <TargetFramework>net5.0-windows</TargetFramework>
  <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
      
      



Wie es funktioniert

Der Build importiert automatisch Dateien aus Microsoft.NET.Sdk \ Zielen.

Außerdem enthält dotnet \ sdk \ 5.0 \ Sdks \ Microsoft.NET.Sdk.WindowsDesktop \ Ziele \ Microsoft.NET.Sdk.WindowsDesktop.props den folgenden Code:





    <FrameworkReference Include="Microsoft.WindowsDesktop.App" IsImplicitlyDefined="true"
                        Condition="('$(UseWPF)' == 'true') And ('$(UseWindowsForms)' == 'true')"/>

    <FrameworkReference Include="Microsoft.WindowsDesktop.App.WPF" IsImplicitlyDefined="true"
                        Condition="('$(UseWPF)' == 'true') And ('$(UseWindowsForms)' != 'true')"/>

    <FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" IsImplicitlyDefined="true"
                        Condition="('$(UseWPF)' != 'true') And ('$(UseWindowsForms)' == 'true')"/>
      
      



Wo ist das Problem

, FrameworkReference : .NET , NuGet





, - , Windows Forms WPF 'net5.0-windows'.





, .





Windows Forms WPF , 60 .









using System.Windows.Forms;

namespace Library
{
    public class Demo
    {
        void ShowForm()
        {
            var f = new Form();
            f.Show();
        }
    }
}

      
      







using System;

class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}
      
      



, Library.Demo.





dotnet publish:





dotnet publish ConsoleApp.csproj --self-contained -c Release -r win-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true /p:IncludeAllContentForSelfExtract=true
      
      



81,8!





IncludeAllContentForSelfExtract %TEMP%\.net .





?

Library.Demo, PublishTrimmed, Windows Forms .





dotnet publish , !





1

:





<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <!--    -->
    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
  </PropertyGroup>


  <ItemGroup>
    <!-- .NET Runtime -->
    <!--      PrivateAssets="all"  ,     -->
    <FrameworkReference Include="Microsoft.NETCore.App" />
    
    <!-- Windows Desktop -->
    <!-- PrivateAssets="all" -     -->
    <FrameworkReference Include="Microsoft.WindowsDesktop.App" PrivateAssets="all"  />
    
    <!--     :
      Microsoft.WindowsDesktop.App.WPF
      Microsoft.WindowsDesktop.App.WindowsForms -->
  </ItemGroup>

</Project>
      
      



DisableImplicitFrameworkReference





PrivateAssets="all". .





2

.net5.0-windows .net5.0





:





dotnet publish ConsoleApp.csproj --self-contained -c Release -r win-x64 /p:PublishSingleFile=true /p:PublishTrimmed=true /p:IncludeAllContentForSelfExtract=true
      
      



18.8





Sollten Sie dies in Bibliotheken tun?





Definitiv Ja!





Auf diese Weise können Sie einerseits Typen aus Windows Forms oder WPF verwenden, andererseits kann der Collector alle nicht verwendeten Dateien wegwerfen und eine kleinere Dateigröße erzeugen.








All Articles