本ブログはアフィリエイト広告を利用しています。

Visual Studioを使用してリリースファイルを1つのexeファイルにまとめる

publish プログラミング

*.runtimeconfig.jsonやら*.deps.jsonやら外部のDLLやexeを使用していた場合はリリース対象のexeファイルと同階層に配置されます。
あまりにごちゃごちゃしてると目的のexeを探すのが大変なのでいっそのこと1つにまとめてしまおうという話です。
Visual Studioを使用してリリースファイルを1つのexeファイルにまとめる その2でもできます。

環境

  • Visual Studio 2022 v17.3.0
  • .NET 6.0
  • Windows10 Pro

設定手順

サンプルプロジェクトとしてJsonSchema.Netを参照したものを用意しました。
Releaseでビルドした際の構成は以下のようになっています。

System.Text.Json.dll
JetBrains.Annotations.dll
Json.More.dll
JsonPointer.Net.dll
JsonSchema.Net.dll
onefile.deps.json
onefile.dll
onefile.exe
onefile.pdb
onefile.runtimeconfig.json

.csproj編集

それでは設定していきます。
プロジェクトをダブルクリックし、XXX.csprojを開きます。

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="JsonSchema.Net" Version="3.2.0" />
  </ItemGroup>

</Project>

PropertyGroupに以下を追加してください。
RuntimeIdentifierに設定する値はwin-x64、win10-x64など実行環境に合わせて指定していきます。
詳細はhttps://docs.microsoft.com/ja-jp/dotnet/core/rid-catalogを参照してください。

<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishReadyToRun>true</PublishReadyToRun>

リリースファイル作成準備

次にプロジェクトを右クリック -> 発行 をクリックします。

publish

ダイアログが出てくるのでフォルダー -> 次へ -> フォルダーを選択します。ダイアログが出てこなければ画面上に出ている発行プロファイルの追加をクリックしてください。

publish-dialog

保存先を指定し完了をクリックします。
以上で準備が整いました。

publish-save

リリースファイル生成

準備が完了すると画像のように発行ボタンが表示されるのでこちらをクリックして完了です。

app-publish
publishing
build-complete

指定したリリースフォルダを確認すると実行に必要なdll等を全て盛り込んだファイルであるため多少サイズが大きくなりますが目的のexeファイルとpdbが出来上がります。

onefile.exe
onefile.pdb

除外設定

exe内に埋め込みたくないファイルがある場合は <ExcludeFromSingleFile>true</ExcludeFromSingleFile>で設定できます。

<ItemGroup>
  <Content Update="Test.dll">
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
  </Content>
</ItemGroup>

参考

関連記事

コメント

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