パソコン関連の書籍等を読んで試したりしながらアウトプットしまくります。

アウトプットしながら学ぶ

トラブル対応

KeePass ソースコードをビルドしたら sgen.exe がエラー! ― 試行錯誤で原因を突き止めた話

投稿日:

はじめに

KeePass のソースコード(v2.59)を Visual Studio 2022 (.NET Framework 4.8) でビルドしてみたら、
通常ビルドは通るのにリビルドだけエラーになるという奇妙な現象に遭遇しました。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\sgen.exe"
/assembly:"(プロジェクトフォルダ)\Build\KeePass\Debug\KeePass.exe"
/force /nologo /compiler:/keycontainer:VS_KEY_8C26407DBC890166 /compiler:/delaysign-
はコード 1 で終了しました。

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 を開くと、

<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>

という設定が。
これを手動で

<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>

に変更して保存。
→ それでもまだ sgen が呼ばれる。

もう少し根深そうです。


原因の発見

プロジェクトの [ビルド イベント] タブを見て、ようやく決定的な原因が分かりました。
なんと、**「ビルド後イベントのコマンドライン」**に sgen.exe を手動で呼び出す記述が残っていたのです。

"$(SDK40ToolsPath)sgen.exe" /assembly:"$(TargetPath)" /force /nologo /compiler:/keycontainer:VS_KEY_8C26407DBC890166 /compiler:/delaysign-

これこそが犯人。
リビルド時は毎回これが走り、署名のキーコンテナ指定でエラーになっていました。


解決方法:ビルド後イベントを削除するだけ

Visual Studio 上で以下のように修正します。

  1. プロジェクト KeePass_N48 → [プロパティ]

  2. 左メニューから「ビルド イベント」

  3. **「ビルド後イベントのコマンドライン」**に書かれている内容をすべて削除

  4. [Ctrl + S] で保存

  5. [ビルド] → [ソリューションのクリーン] → [リビルド]

これで完全に解決。
sgen.exe は実行されず、ビルド・リビルドともにエラーは発生しなくなりました。


補足:sgen.exe とは?

sgen.exeXML 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 ソースコードのフォルダ構成を徹底解説







-トラブル対応
-, , , , , , , , , , ,

Copyright© アウトプットしながら学ぶ , 2025 AllRights Reserved Powered by AFFINGER4.