2009-07-10 20 views
2

リフレクションを使用してプラグインをロードする.NETアプリケーションを開発しています。私のプラグインはC#クラスライブラリです。問題は、私のプラグインの中には従来のWin32 DLLを参照するものがあり、C#はあたかもそれらが.NET DLLであるかのように依存関係を読み込もうとしているということです。私は、次のメッセージでSystem.BadImageFormatExceptionを取得Win32 DLLを参照するアセンブリをロードするにはどうすればよいですか?

string fileName = "plugin.dll"; 
Assembly.LoadFrom(fileName); 

Could not load file or assembly 'plugin.dll' or one of its dependencies. 
The module was expected to contain an assembly manifest. 

どのように私はプログラム的にWin32のDLLを参照するアセンブリをロードします。ここ

は、私はプラグインを読み込む方法ですか?

答えて

1

あなただけのdllの中からいくつかの機能が必要な場合は、あなたがこれを行うことができます:

[DllImport("plugin.dll")] 
    public static extern void SomeFunction(); 
1

あなたはAssembly.LoadFileを試してみましたか()?

LoadFromはLoadFromコンテキストにファイルをロードせず、Lo​​adFromメソッドのようにロードパスを使用して依存関係を解決しないことに注意してください。 LoadFromは同じIDでパスが異なるアセンブリをロードするために使用できないため、この限られたシナリオでは便利です。

foreach (string filePath in Directory.GetFiles(path, "*.DLL")) 
{ 
    try 
    { 
     _assemblies.Add(Assembly.LoadFile(filePath)); 
    } 
    catch (FileNotFoundException) 
    { 
     // Attempted to load something with a missing dependency - ignore. 
    } 
    catch (BadImageFormatException) 
    { 
     // Attempted to load unmanaged assembly - ignore. 
    } 
} 

あなたがまだ利用可能であり、事故によるネイティブのDLLをロードしないで、あなたの依存関係を管理することを確認またはネイティブ行う必要があります。それは、あなたは、次のような何かをしたい

1

のみ最初のそのようなアセンブリをロードします。マネージアセンブリのために必ず彼らが発見されているようにするのapp.configにパスをプロービング.NETを変更する必要があります。

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <probing privatePath="modules"/> 
     </assemblyBinding> 
    </runtime> 

理想的には、あなたがアセンブリの多くにLoadFileがを呼び出すと、別のディレクトリにあなたのプラグインを入れたいです興味がないのは遅いですし、アセンブリをAppDomainに読み込んだらアンロードすることはできません。

関連する問題