.NetCore3.0で単一バイナリを生成する方法

.Net Core

はじめに

.NetCoreでプラットフォームを指定して発行すると、関連dllも大量に含まれます
関連dllが含まれていても実用上問題ありませんが、不特定多数のユーザーに配布する場合、どのファイルを実行すれば良いか分かりにくいかもしれません
.NetCore3.0以降の機能で関連dllをバイナリに含め単一バイナリとして出力することができます

簡単な例

例えば下記のような64bitのwindows向けのcsprojを想定します

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp3.0</TargetFramework> 
    <RuntimeIdentifier>win-x64</RuntimeIdentifier> 
  </PropertyGroup> 
</Project>

Program.csは以下の通りです
いわゆるHelloWorldです

using System; 
namespace ConsoleApp1
{ 
    class Program 
    { 
        static void Main(string[] args) 
        {
            Console.WriteLine("Hello World!");
        } 
    } 
}

このプロジェクトを下記コマンドで発行します

dotnet publish -c release -o deploy

するとdeployフォルダにはapi-ms-win-core-console-l1-1-0.dllなど225個もの大量のファイルが生成されます
肝心のexeを見つけるのが大変だと思われます
PCに詳しい人向けに配布する分には問題ないかもしれませんが、業務アプリなどITリテラシーが低い人が使う可能性のあるアプリでは問題があるかもしれません

単一バイナリで出力する

csprojに<PublishSingleFile>true</PublishSingleFile>を追加します

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp3.0</TargetFramework> 
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PublishSingleFile>true</PublishSingleFile>  <!-- この行を追加する -->
  </PropertyGroup> 
</Project>

発行は同様のコマンドで行います

dotnet publish -c release -o deploy

するとdeployフォルダにはexeとpdoの2個のファイルだけが生成されます

おわりに

マルチプラットフォームで開発できるので.NetCoreは好きなのですが、出力ファイルが大量なのが不満でしたが3.0でこの点が解消されよかったです
ただ、単一バイナリにしてもトータルの容量は変わりませんでした
HelloWorldで65MBもあるので願わくば今後容量が下がるようになればと思います

タイトルとURLをコピーしました