15

1 つの実行可能ファイルと 5 つのライブラリで構成されるアプリケーションがあるとします。通常、これらはすべて 1 つのディレクトリに含まれ、ライブラリはそこからロードされます。

たとえば、一部のライブラリを Lib という 1 つのディレクトリに配置し、残りを Lib2 というディレクトリに配置することはできますか? そのため、アプリケーション ディレクトリには実行可能ファイル自体のみが含まれ、他のアセンブリはさまざまな論理ディレクトリに含まれます。

これどうやってするの?また、アセンブリをロードする方法だけでなく、アプリケーションをビルドしてアセンブリを正しいディレクトリに配置する方法も知りたいです。

4

4 に答える 4

32

アセンブリを読み込むために検索する app.config に追加の検索パスを追加できます。例えば

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="lib;thirdParty" />
  </assemblyBinding>
</runtime>

詳細については、こちらをご覧ください。

于 2009-10-20T12:23:11.923 に答える
12

アセンブルを取得する場所を手動で管理する場合は、次の2つの可能性があります。

  1. AppDomain.AssemblyResolveイベントを処理します(SLaksで説明されています)。コードスニペットは次のとおりです。

    static void Main(string[] args)
    {
       ...
       AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
       ...
    }
    
    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
       string assembliesDir = "your_directory";
       Assembly asm = Assembly.LoadFrom(Path.Combine(assembliesDir, args.Name + ".dll"));
       return asm;
    }
    
  2. 独自の設定でドメインを作成します(AppDomainSetupオブジェクトのApplicationBaseまたはPrivateBinPathプロパティを設定します)。

したがって、現在のドメインで作業を継続する場合は、方法1を使用する必要があります。

于 2010-06-07T18:09:52.823 に答える
2

アセンブリを配置したいフォルダーに自動的にコピーするには、Copy Localすべての参照を true に設定し、ビルド後の手順でそれらをサブディレクトリに移動します。

または、false に設定Copy Localし、参照される DLL ファイルをファイルとしてプロジェクト内の適切なサブディレクトリに追加し、[Build Action出力ディレクトリにコピー] に設定することもできます (これにより、サブディレクトリが保持されます)。

ランタイムにそれらを検出させる最も柔軟な方法は、AppDomain.AssemblyResolveイベントを処理し、 Assembly.LoadFileを使用してアセンブリを手動で読み込むことです。コードがどのアセンブリがどのディレクトリにあるかを知るには、何らかの方法が必要です。

于 2009-10-20T12:34:12.587 に答える
0

あなたのコメントでは、実行時にパスと場所を追加することに言及しています。はい、できますが、Assembly.Load() と、場合によってはリフレクションを使用する必要があります。

于 2009-10-20T12:45:31.337 に答える