目次
はじめに
KeePass のソースコード(v2.59)を Visual Studio 2022 (.NET Framework 4.8) でビルドしてみたら、
通常ビルドは通るのにリビルドだけエラーになるという奇妙な現象に遭遇しました。
Visual Studio のエラー一覧には sgen.exe の文字。
.NET 4.8 時代にこれは見ないと思っていたので「?」となりました。
エラーの状況
-
KeePass_N48.sln を開いてビルド → ✅ 成功
-
そのまま リビルド(再ビルド) → ❌ 失敗
-
失敗時の出力を見ると、必ず
sgen.exeが動いてエラーになる
つまり、リビルド時だけ何か余計な処理が動いているようでした。
最初に試したこと(失敗例)
1. 「署名」を外す
まず思い浮かぶのは「PFX(署名証明書)の問題」。
KeePassLib.pfx / KeePass.pfx はダミー証明書で、ReadMe_PFX.txt にパスワード 123123 と書かれています。
これを使わずビルドするために、プロジェクト設定で署名を外しました。
-
[プロパティ] → [署名] →
-
「ClickOnce マニフェストに署名する」→ オフ
-
「アセンブリに署名する」→ オフ
-
結果:
通常ビルドは通るが、リビルドで依然エラー発生。
2. 「シリアル化アセンブリの生成」をオフ
次に「sgen.exe は XML シリアライザーを作るツールだから」と考え、
[ビルド] タブにある 「シリアル化アセンブリの生成」 を オフ にしてみました。
結果:
依然エラー。sgen はなぜか実行され続ける…。
3. KeePass_N48.csproj を直接編集
試しにプロジェクトをアンロードして、KeePass_N48.csproj を開くと、
という設定が。
これを手動で
に変更して保存。
→ それでもまだ sgen が呼ばれる。
もう少し根深そうです。
原因の発見
プロジェクトの [ビルド イベント] タブを見て、ようやく決定的な原因が分かりました。
なんと、**「ビルド後イベントのコマンドライン」**に sgen.exe を手動で呼び出す記述が残っていたのです。
これこそが犯人。
リビルド時は毎回これが走り、署名のキーコンテナ指定でエラーになっていました。
解決方法:ビルド後イベントを削除するだけ
Visual Studio 上で以下のように修正します。
-
プロジェクト
KeePass_N48→ [プロパティ] -
左メニューから「ビルド イベント」
-
**「ビルド後イベントのコマンドライン」**に書かれている内容をすべて削除
-
[Ctrl + S] で保存
-
[ビルド] → [ソリューションのクリーン] → [リビルド]
これで完全に解決。sgen.exe は実行されず、ビルド・リビルドともにエラーは発生しなくなりました。
補足:sgen.exe とは?
sgen.exe は XML Serializer Generator の略で、
XML シリアライザーを事前コンパイルして性能を上げるツールです。
しかし、.NET 4.x 以降では自動で最適化されるため、
手動で sgen を呼び出す必要はありません。
KeePass の古いプロジェクトファイルにはこの設定が残っているため、
Visual Studio 2022 環境では署名付きコマンドがエラーを引き起こします。
まとめ
| 項目 | 内容 |
|---|---|
| エラー内容 | sgen.exe が /keycontainer:VS_KEY_... で失敗 |
| 原因 | ビルド後イベントに古い sgen コマンドが残っていた |
| 解決方法 | 「ビルド後イベントのコマンドライン」を空にする |
| 余談 | シリアル化アセンブリの生成オフ、署名オフでも解決せず |
| 教訓 | 古いソースをビルドするときは「ビルドイベント」も要チェック! |
環境メモ
-
Windows 11 Pro
-
Visual Studio 2022 v17.14
-
.NET Framework 4.8
-
KeePass 2.59 ソースコード
おわりに
ネット上では「署名を外せばOK」とだけ書かれているケースが多いですが、
根本原因は “ビルド後イベントの sgen 呼び出し” でした。
古い .NET プロジェクトを触るときは、
「プロパティ → ビルド イベント」も忘れずチェックしましょう。
きっと同じ罠にハマる人がいます😅
🔙 前回の記事:KeePass ソースコードのフォルダ構成を徹底解説