ここに欠けている単純なものがあることを願っています。私は2つの別々のプロジェクトを維持しようとしています
ProjectName.Core &
ProjectName.Infrastructure
これは典型的な Onion アーキテクチャで作成されているため、サービスを疎結合して柔軟性を高めることができます。Infrastructure プロジェクトは Core プロジェクトを参照します。コンパイルすると、これらの DLL が生成されます
ProjectName.Core.dll &
ProjectName.Infrastructure.dll
しかし、1つのdllだけを生成したいと思います。
ProjectName.Infrastructure.dll (or even ProjectName.dll)
ILMerge を使用してこの操作を実行しようとしましたが、Infrastructure は Core を参照するため、Core dll が見つからないため、例外がスローされます。それは明らかに自分自身の中を見ているわけではありません。
コアを参照する他の組み合わせと、次のように結合される別のプロジェクトがあるため、個別のプロジェクトを維持する必要があります。
ProjectName.Core &
ProjectName.DataAccess &
ProjectName.Web
編集:私の現在のソリューションは、Nant ビルド スクリプトを使用して ILMerge を呼び出します。無事に合流しました。しかし、マージされた DLL を使用しようとすると、Core ライブラリが見つからないため、例外がスローされます。
<target name="merge.core">
<property name="temp.dir" value="${build.dir}\Temp\"/>
<mkdir dir="${temp.dir}" if="${not directory::exists(temp.dir)}"/>
<property name="tools.dir" value=""${directory::get-current-directory()}\Tools\""/>
<exec program="Tools\ILMerge\ILMerge.exe" workingdir=".">
<arg value="/t:Library"/>
<arg value="/ndebug"/>
<arg value="/out:"${build.dir}\Temp\ProjectName.Infrastructure.dll""/>
<arg value=""${build.dir}ProjectName.Core.dll""/>
<arg value=""${build.dir}Xceed.Compression.dll""/>
<arg value=""${build.dir}ProjectName.Infrastructure.dll""/>
<arg value=""${build.dir}ProjectName.Infrastructure.XmlSerializers.dll""/>
</exec>
<delete file="${build.dir}ProjectName.Core.dll"/>
<delete file="${build.dir}Xceed.Compression.dll"/>
<delete file="${build.dir}ProjectName.Infrastructure.dll"/>
<delete file="${build.dir}ProjectName.Infrastructure.XmlSerializers.dll"/>
<move file="${build.dir}\Temp\ProjectName.Infrastructure.dll" tofile="${build.dir}ProjectName.Infrastructure.dll"/>
<delete dir="${temp.dir}" if="${directory::exists(temp.dir)}"/>
</target>
もう少し明確にするために。コア ライブラリのオブジェクトは使用できますが、インフラストラクチャ ライブラリは使用できません。これらのオブジェクトの 1 つをインスタンス化しようとすると、.NET が依存関係を読み込もうとしているように見えますが、それを見つけることができないためです。