概要
ILMergeの呼び出しが呼び出され、ビルドが単一のアセンブリになるように、2アセンブリソリューションのビルドプロセスを変更したいと思います。さらに、結果のアセンブリにデバッグできるようにしたいと思います。
準備-簡単な例
- 新しいソリューション-ClassLibrary1
- 文字列「Helloworld」を返す静的関数「GetMessage」をClass1に作成します
- ClassLibraryを参照する新しいコンソールアプリを作成します。
- コンソールを介してmain()からGetMessageを出力します。
これで、「HelloWorld」をコンソールに出力する2つのアセンブリアプリができました。
では、次に何を..?
コンソールアプリのビルドプロセスを変更して、ILMergeを使用するビルド後の手順を含め、ClassLibraryアセンブリをコンソールアセンブリにマージしたいと思います。
このステップの後、私は次のことができるようになるはずです。
- ClassLibrary1.dllが存在しない状態で、コンソールアプリを直接実行します
- VSでF5(またはF11)を介してコンソールアプリを実行し、2つのプロジェクトのそれぞれにデバッグできるようにします。
限られた成功
私はこのブログ投稿を読み、ビルド後のコマンドで後のマージを達成することができました...
"$(ProjectDir)ILMerge.bat" "$(TargetDir)" $(ProjectName)
...そして以下を読み取るILMerge.batファイル...
CD %1
Copy %2.exe temp.exe
ILMerge.exe /out:%2.exe temp.exe ClassLibrary1.dll
Del temp.exe
Del ClassLibrary1.*
これはかなりうまく機能し、実際には、必要に応じてVS環境の外部で実行されるexeを生成します。ただし、VSがコードにデバッグするために使用できるシンボル(.pdbファイル)を生成するようには見えません。
これがパズルの最後のピースだと思います。
誰かが私がこれを機能させる方法を知っていますか?
FWIW x64Win7x64マシンでVS2010を実行しています。
更新:なぜこれをしたいのですか?
「デバッグシナリオ中に本当にILMergeを実行する必要がありますか?」
私のソリューションのアセンブリは、他のソリューションのアセンブリと同じフォルダーに共存する必要があります(そのうちのいくつかは開発する可能性があります)
これらのソリューションの一部は、一部のアセンブリの異なるバージョンへの依存関係を共有します。
したがって、Solution1はConsole1とClassLibrary1.dll(v1)で構成され、Solution2はConsole2とClasslibrary1.dll(v2)で構成されている可能性があります。
すべてをGACに登録するのではなく、衝突を回避するために、正しいバージョンの依存関係をソリューションのプライマリアセンブリにILMergeできると思いました。
ただし、これにより、現在、ソリューションをデバッグできなくなります。これは、存在する他のソリューションと組み合わせて実行する必要があります。
これは複雑に聞こえますか?それはそうだからです..:D