rksoftware

Visual Studio とか C# とかが好きです

.NET 5 の確認「単一ファイルの配置と実行可能ファイル」

■ .NET 5 の単一ファイルの配置と実行可能ファイル

ドキュメントはこちら

.NET Core 3.1 までは単一ファイルとはいうものの、自己展開形式書庫ファイルのようなものでした。実行時に OS の Temp フォルダに必要なファイルが展開されるというものでした。
これは配布は楽だったのですが、マシンのディスク領域を圧迫するし、ユーザーが自分で Temp に展開されたファイルを狙って削除する (アンインストール的な) のも簡単ではなかったです。

.NET 5 ではファイルが展開されることなく実行されます。これはうれしいですね。単一ファイルの機能ができたとき当初こちらの動作を期待した方も多かったのではないでしょうか?

■ 注意点

この .NET 5 の単一ファイルを使うと使えない API や動作の変わる API があります。
といってもそう気にする必要はなく、Assembly のパスなどが取得できなかったりするだけです。代替手段のドキュメントに記載があるので安心です。

ちなみに私は検証コードで最初 Assembly.Location を書いてはまりました (.NET 5 の単一ファイルでは常に null)。

■ 使い方

使い方は簡単です。というか何もする必要がありません。
プロジェクトのターゲット フレームワークが .NET 5 であれは新しい動作になります。

■ 検証コード

コードを書いて発行、実行して確認してみます。
プロジェクトは ClassLibrary1.dll というライブラリを参照をしています。ファイルが展開されていてば、2 つ目の出力が True になるはずです。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(AppContext.BaseDirectory);
        Console.WriteLine(System.IO.Directory.GetFiles(AppContext.BaseDirectory).Any(f => f.EndsWith("ClassLibrary1.dll")));
    }
}

■ 結果

.NET Core 3.1

C:\Users\<ユーザー名>\AppData\Local\Temp\.net\ConsoleApp1\<ランダムな文字列>\
True

.NET 5

※発行した .exe ファイルをその場で実行しています。

<プロジェクトのディレクトリ>\ConsoleApp1\bin\Release\net5.0\publish\
False

■ まとめ

実行時に展開されなくなったことで、より扱いやすくなりました。
.NET 5ClickOnce が復活しましたが、ものによっては配布はこの単一ファイル機能で事足りるかもしれません。

ClickOnce 参考

選択肢として備えましょう。