【C#】バイナリにローカルパスを含めない設定

C#をビルドしてEXEやDLLを生成するとバイナリの中にビルドしたときのパスが入っていたりするのを除去する方法です。

特に設定しない状態でC#をビルドしたバイナリを一般公開してしまうと、ユーザーフォルダ内で開発していてパスに個人名に関係する名称が含まれている場合、そのパスがバイナリに埋め込まれてしまい公開するべきでない個人情報が意図せず公開される可能性があります(パスから名前ばれ、PCユーザー名ばれ、スタックトレースを出力している場合開発環境の状態が公表される etc...)したがって、このような状況を回避するために設定すべき2項目を紹介したいと思います。

Directory.Build.propsファイルの配置

プロジェクトのルートフォルダ(=ソリューションファイルと同じ位置)に'Directory.Build.props'というファイルを作成して配置します。

参考URL

<Project>
 <PropertyGroup>
    <!-- 決定論的ビルドの有効化 -->
    <Deterministic>true</Deterministic>
    <!-- 埋め込みビルドパスの置き替え(どこでビルドしてもアセンブリが変わらないようにする指定) -->
    <RepoRoot>$([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\'))</RepoRoot>
    <PathMap>$(RepoRoot)=.</PathMap>
 </PropertyGroup>
</Project> 

プロジェクトファイルの編集

UI上から設定できないためプロジェクトファイルを直接開いて以下内容を追記します。

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
    <!-- Release ビルド時に有効化 -->
    <EmbedUntrackedSources>false</EmbedUntrackedSources>
    <SourceLinkCreate>false</SourceLinkCreate>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' != 'Release'">
    <!-- Debug ビルド時やその他のビルド構成では無効化 -->
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
    <SourceLinkCreate>true</SourceLinkCreate>
</PropertyGroup>

これで、Releaseビルドした時だけ不要なパス情報がバイナリ内に含まれなくなります。

簡単ですが以上です。