目次
はじめに
.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もあるので願わくば今後容量が下がるようになればと思います