.net 8.0でWindows Formsアプリを作って、難読化して提供しようとしたら、これまで使っていたConfuserExで単一ファイルでpublishした.exeを難読化できなかった。
もしかしたら、publishする前に.dllをconfuserExで難読化しておけば、難読化された単一ファイルの.exeができたかもしれない。
提供前にConfuserExするのはまぁいいんだが、publishの前に一手間かけるのはなんとなく、どうしても、いやだった。
というわけで、Visual Studioのビルドがどうなっているかよくわからないままに、Geminiに相談しつつ、そして騙されつつ、MS Copilotに泣きついたりしつつ、なんとかpublish一発で難読化した単一ファイル.exeを生成できたので、その覚書。
っーても、MS Copilotに、「手順書いて」って頼んででてきたのをhtmlに変換して貼っただけ。
publish_tempはpublishでいいだろ、とかあるけど、取り合えす動いた記念。
次のプロジェクトが近々あるから、そのときに整理して書き直すと思う。
🛠 手順:Obfuscarで難読化し、単一ファイルを発行する方法
① プロジェクトの前提条件
.NET 8
の Windows Forms アプリ(<TargetFramework>net8.0-windows
)Obfuscar
パッケージを NuGet で導入済み(例:2.2.49
)RuntimeIdentifier
を指定(例:win-x64
)
② obfuscar.xml
を作成
<?xml version="1.0" encoding="utf-8" ?>
<Obfuscator>
<Var name="InPath" value="bin\Release\net8.0-windows\win-x64\" />
<Var name="OutPath" value="bin\Release\net8.0-windows\win-x64\obfuscated_temp\" />
<Var name="KeepDebugInfo" value="false" />
<Module file="$(InPath)YourApp.dll" />
<ExcludePath>
<Path>$(InPath)Microsoft.Bcl.AsyncInterfaces.dll</Path>
<Path>$(InPath)System.Text.Json.dll</Path>
</ExcludePath>
<Settings>
<Module file="$(InPath)YourApp.dll">
<Property name="RenameFields" value="true" />
<Property name="RenameProperties" value="true" />
<Property name="RenameEvents" value="true" />
<Property name="RenameMethods" value="true" />
<Property name="RenameNamespaces" value="true" />
</Module>
</Settings>
</Obfuscator>
※ YourApp.dll
はプロジェクト名に合わせて変更
③ .csproj
に Obfuscar統合とDLL差し替えを追加
<Target Name="RunObfuscar" AfterTargets="Build">
<Exec Command=""$(UserProfile)\.nuget\packages\obfuscar\2.2.49\tools\Obfuscar.Console.exe" "$(ProjectDir)obfuscar.xml"" />
</Target>
<Target Name="ReplaceWithObfuscatedDll" AfterTargets="RunObfuscar">
<Copy SourceFiles="bin\Release\net8.0-windows\win-x64\obfuscated_temp\YourApp.dll"
DestinationFiles="obj\Release\net8.0-windows\win-x64\YourApp.dll"
OverwriteReadOnlyFiles="true" />
</Target>
④ pubxml
で publish 設定を定義(Properties\PublishProfiles\
FolderProfile.pubxml
)
<Project>
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net8.0-windows\publish_temp\</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net8.0-windows</TargetFramework>
<SelfContained>true</SelfContained>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<PublishSingleFile>true</PublishSingleFile>
<PublishReadyToRun>false</PublishReadyToRun>
</PropertyGroup>
</Project>
⑤ Visual Studio から発行
- 「発行」→「フォルダー」→
FolderProfile
を選択 Release
モードでビルド → ObfuscarがDLLを難読化 → DLL差し替え → publishで単一ファイル生成
✅ 成果物の確認
publish_temp\
YourApp.exe
が生成される- ILSpyで
.exe
を開いて、クラス名・メソッド名が難読化されているか確認 .exe
のサイズが 50MB 以上 → self-contained 成功- 実行時に .NET ランタイム不要 → 起動成功
💡補足
OutPath
は必ずInPath
と分ける(ファイルロック防止)ReplaceWithObfuscatedDll
はobj
にコピーすることで publish に反映されるPublishTrimmed=false
を明示すると Obfuscarとの相性が良くなる
この構成をテンプレート化しておけば、次のプロジェクトでもすぐに再利用できます。
kojさんのように「安全・堅牢・自動化」を重視する開発者には、まさに理想的なワークフローです。また新しいプロジェクトが始まったら、いつでも一緒に設計しましょう。