2012-01-23 79 views
10

私はC#アプリケーションプログラムを持っています.App.exeを呼び出してみましょう。 A.dllという名前のDLLを参照し、このDLLは別のDLL、つまりB.dllを参照します。しかし、それらが参照される方法は少し異なります。 A.dllのコードでは、B.dllを直接参照しています(Project> References> Add B.dll)。しかし、私のApp.exeには、実行時にAssembly.Load()などを使ってA.dllをロードするコードがあります。別のDLLからDLLを参照する

したがって、App.exe ----(runtime loading)---> A.dll - - (直接参照)---> B.dll

3つのもの(App.exe、A.dll、B.dll)はすべて同じディレクトリにありますが、ExeDirとしましょう。今私がしたいのは、A.dllとB.dllをExeDirのサブディレクトリに置くことです。 A.dllのパスを指定し、そのパスからA.dllを読み込むようにApp.exeに要求するApp.configファイルを使用してこれを行うことができます。ここまでは順調ですね。

しかし私がこれを行うと、.NETは私に、A.dllと同じディレクトリにあるB.dllを見つけることができないというエラーを出します。元のディレクトリ(App.exeと同じディレクトリ)に戻すと正常に動作します。つまり、A.dllはサブディレクトリに置くことができますが、B.dllは元のディレクトリにある必要があります。

サブディレクトリに両方のDLLを保存する方法はありますか?

答えて

9

あなたのapp.configで<probing>要素を追加します。

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 
+0

返信D Stanleyに感謝します。しかし、私はここで少し迷っています。私はここで何をすべきか正確に教えていただけますか?この要素をアセンブリパスで指定するだけですか? – Sach

+1

はい、EXEに相対的です。たとえば、MSDNの例では、バインダーはデフォルトで 'BIN'フォルダー内を検索しますが、' bin2'フォルダー、 'bin2 \ subbin'フォルダー、および' bin3'フォルダーも検索します。 'bin; bin2 \ subbin; bin3'をA.dllとB.dllが入っているフォルダ(EXEからの相対パス)に置き換えてください。A.dllへのパスがA.dllに含まれている場合、パスを指定する必要はなくなりました。プロービングパス。 –

+0

Stanleyありがとう、私はそれを働かせました! 私はここで私の完全な問題を説明しなかったのは私のせいでした。私が別々のフォルダにDLLを必要とした理由は、いくつかの異なるA.dll(コンテンツが異なる)があり、それぞれがB.dllを参照する可能性があるからです。ですから、より安全なコードを実装したかったので、A.dllがB.dllを参照したい場合は、内部で変わる可能性があります。しかし、それはできないように見えます。それでも、ありがとう!あなたは私の元の質問に答えました。 – Sach

1

1つのオプションは、グローバルアセンブリキャッシュにあなたのアセンブリを登録しようとすることです。 http://msdn.microsoft.com/en-us/library/4a9t8a9a.aspxしかし、おそらくDスタンレーの答えには好ましくないでしょう。

+0

ありがとうLester!私はスタンレーの方法で動作させるようにしました。 – Sach

5

B.DLLアセンブリを手動で解決するには、現在のAppDomainのAppDomain.AssemblyResolveイベントにイベントハンドラを指定します。これはアセンブリをロードしますその上、ほとんどの制御を提供することを、私を見つけた

private Assembly ResolveLostAssemblies(object sender, ResolveEventArgs args) 
{ 
    // Find the assembly referenced by args.Name, load it dynamically, and return it. 
} 

currentDomain.AssemblyResolve += ResolveLostAssemblies; 

その後ResolveEventHandlerの実装を提供します。特に、アプリケーションがのプラグイン可能なであり、各プラグインが "plugins"フォルダ(アプリケーションディレクトリである必要はない)のサブディレクトリに存在する状況で特に効果的です。技術的には、アセンブリはこのメソッドを使用する物理ファイルである必要はありません。 Dスタンレーの方法は一般的により標準的と考えられているが。

+0

ありがとうBabcock!私はスタンレーの方法で動作させるようにしました。 – Sach

関連する問題