なぜILMergeにこだわっているかというと、
① Costura.Fodyでマージしようとしたときに、自己証明書を使ってアセンブリに署名すると、マージに失敗する。よってアセンブルに署名できない。
② ディジタル署名しようとすると、発行で手間がかかる。
③ マージしないとdllをたくさん置かなければならなくて不愉快。
この3つの理由で、ILMergeを使いたいのだが、なぜかビルド後イベントで失敗します。。。
if $(ConfigurationName) == Release (
del /S /Q "$(TargetDir)Merge\*.*"
"C:\Test\Emocheck_Mail\packages\ILMerge.3.0.41\tools\net452\ILMerge.exe" /internalize /ndebug /targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2" /wildcards /out:"$(TargetDir)\Merge\$(TargetFileName)" "$(TargetDir)\$(TargetFileName)" "$(TargetDir)\"*.dll"
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\signtool.exe" sign -fd sha256 -f "C:\Test\codesign\*****.pfx" /p ***** -tr http://timestamp.digicert.com -td sha256 -v "$(TargetDir)\Merge\$(TargetFileName)"
)
ビルド後イベントに記述されていたのは、↑これでしたが。。。
①ILMrege.exeが本当にそこにあるのかチェック。
②out: の出力ディレクトリの文字列がおかしくなっていないかチェック。
③コマンドプロンプトでILMerge.exeを実行してみる。
特に③が有効で、失敗するとエラーが表示されるので助かります。
原因は
①ILMerge.exeの場所が間違っていた。 → ILMerge.exeの位置を確認しました。
②それに加えて、出力ディレクトリ、入力のパスもおかしくなっていた。→ パスを直接記述することで解消しました。
\$(TargetFileName)のあたりで"\"が"\\"になってしまっていることがありました。???
③改行を入れるとうまくいかない。 → コマンドプロンプトでのILMerge.exeの実行はためになります。
④.netのバージョン指定に問題があり、コマンドプロンプトでILMerge.exeを実行したところ、エラーが表示されました。
.NETFramework\v4.6.2 → .NETFramework\v4.8
これで解消しました。