更新 - 以下の元の質問
追加のテストを行った結果、問題の原因は .NET がアセンブリを検索する方法にあると考えています。
以下で言及したように、サブディレクトリには .dll ファイルがありますが、以下で言及した .dll ファイルは、各ディレクトリ内の唯一の .dll ファイルではありません。たとえば、\translation\Customer ディレクトリには、Customer.dll ファイルといくつかの標準ファイル (Translation.dll、Mapping.dll、Execute.dll) があります。\translation\Standard ディレクトリには、Standard.dll とその他の標準ファイル (Translation.dll、Mapping.dll、Execute.dll) があります。これらのファイルはすべて (異なるプロジェクトから) 生成されたコードであるため、各ディレクトリには標準ファイルのコピーと、サブディレクトリに直接関連するファイルがあります。
Customer.dll ファイルのメソッドが Windows サービス アプリケーションで実行されると、標準アセンブリ (Translation.dll、Mapping.dll など) の他のメソッドも呼び出されます。他の .dll ファイルへの呼び出しは、同じディレクトリ内の .dll で実行されていないと思います。
たとえば、/translation/Customer/Customer.dll のメソッドを呼び出すと、Translation.dll のメソッドが呼び出されます。ただし、/translation/Customer/Translation.dll でメソッドを呼び出す代わりに、アプリケーションは最初に /translation/Standard/Translation.dll を見つけて、そのファイルでメソッドを呼び出します。
同じディレクトリ内のこれらの関連する .dll ファイルへの呼び出しを .NET に強制することは可能ですか? または、各ディレクトリで一意の名前の「標準」アセンブリを作成するために何かをする必要がありますか?
元の質問:
ディレクトリを監視し、着信ファイルを処理する C# Windows サービス アプリケーションがあります。処理される各ファイルには、ファイルに対して実行される構成可能な一連のタスクがあります。各タスクのコードは、リフレクションを使用して実行時に動的にロードされる外部 .dll に含まれています。外部の .dll はメイン アプリケーション フォルダのいくつかのサブディレクトリに存在し、それらへのアクセスは app.config<probing>
ファイル内のアプリケーションの要素のエントリを介して許可されます。
最近、外部の .dll をより適切に整理するためにサブディレクトリの数を増やしましたが、<probing>
要素で予期しない機能が発生しました。ファイルに対して 2 つのタスクを実行する必要があるファイルを処理するテストを実行しています。最初のタスクはファイル Customer.dll に存在し、「\translation\Customer」というサブフォルダーにあります。2 番目のタスクは Standard.dll ファイルであり、「\translation\Standard」というサブフォルダーにあります。
私の調査要素がこのように見える場合<probing privatePath="translation\Customer;translation\Standard">
、2 番目のタスク ("Standard" フォルダー内の .dll でメソッドを実行する) は実行に失敗します。
ただし、プローブ要素がこのように見えるようにこれらのエントリを切り替えると、<probing privatePath="translation\Standard;translation\Customer">
両方のタスクが正常に実行されます。
プローブ要素内のサブディレクトリの順序が、それらのサブディレクトリ内に含まれる .dll の実行に影響を与える理由を理解できる人はいますか?