6

ここに欠けている単純なものがあることを願っています。私は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="&quot;${directory::get-current-directory()}\Tools\&quot;"/>
    <exec program="Tools\ILMerge\ILMerge.exe" workingdir=".">
      <arg value="/t:Library"/>
      <arg value="/ndebug"/>      
      <arg value="/out:&quot;${build.dir}\Temp\ProjectName.Infrastructure.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Core.dll&quot;"/>
      <arg value="&quot;${build.dir}Xceed.Compression.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Infrastructure.dll&quot;"/>
      <arg value="&quot;${build.dir}ProjectName.Infrastructure.XmlSerializers.dll&quot;"/>
    </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 が依存関係を読み込もうとしているように見えますが、それを見つけることができないためです。

4

4 に答える 4

4

ILMergeを使用します。これを行うには、すぐに使用できます。

于 2009-07-15T04:44:29.403 に答える
2

ILMerge! スライスしたパンとほぼ同じです。

http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx

于 2009-07-15T04:47:00.147 に答える
1

私が知っているように、これは Visual Studio では不可能ですが、すべてのプロジェクトをネットモジュールとしてコンパイルし、それらを DLL として結合することができます。次のようにコンパイルします。

csc misource1.cs misource2.cs misource3.cs /target:module

次に、al.exe ツールと一緒にリンクします。「リンカー入力としての .netmodule ファイル」および「 C# アセンブリ」を参照してください。

于 2009-07-15T04:41:18.067 に答える
0

ILMerge の最新バージョンに/closedは、マージされたアセンブリの推移的な閉鎖で機能するオプションがあります。これはまさにこの問題を解決します (セクション2.6 Closed4.1 Input assembly not merged in correctlyILMerge.doc ユーザー マニュアルを参照)。

ライブラリが名前付きアセンブリからオブジェクトを動的にロードしようとすると、マージされたアセンブリ名が元のアセンブリ名と異なるため、機能しないことに注意してください。この場合、ILMerge でできることは何もありません。これを考慮して依存性注入を変更する必要があります。

于 2010-09-16T17:05:17.487 に答える