2017-11-09 19 views
0

WebAPIアプリケーションにプラグインDLLをロードする必要があります。そこで、プラグインが既存のコントローラの中で反応するアクションを公開するカスタムIPluginインターフェイスを作成し、さらにプラグインDLLがより多くのルートを提供できるようにしたいと考えています。だから私は参照リストにDLLを追加することはできません、私は動的に設定ファイルのエントリに基づいてそれをロードする必要があります。プラグインDLLをWebAPIアプリケーションにロード

したがって、私は私のWebAPIののbinディレクトリ(C:\users\Alexander\Source\Repos\Testbed\WebAPI\bin)にExamplePlugin.DLLを追加し、Web構成ののAppSettingsからそれを参照:

<add key="ExamplePlugin" value="ExamplePlugin.dll" /> 

とこのようにそれをロードしよう:

string dllRelativePath = ConfigurationManager.AppSettings[possiblePlugin]; 
FileInfo dllFileInfo = new FileInfo(dllRelativePath); 
Assembly dllAssembly = Assembly.LoadFile(dllFileInfo.FullName); 
foreach (Type type in dllAssembly.GetExportedTypes()) 
{ 
    if (typeof(IPlugin).IsAssignableFrom(type)) 
    { 
     IPlugin i = (IPlugin)Activator.CreateInstance(type); 
     PluginManager.Add(i); 
    } 
} 

をしかし、エラーメッセージには、

System.IO.FileNotFoundException:と表示されます。 ファイルを読み込めませんでした。c:¥windows¥system32¥inetsrv¥ExamplePlugin.dll: ダッシュシステムでは、ファイルシステムが見つかりませんでした。 (Ausnahmeフォン HRESULT:0x80070002が)

なぜWebAPIのDLLが間違ったフォルダで検索され、どのように私はこの問題を解決することができますか?

答えて

1

パスをアプリケーションフォルダにマップする必要があります。そうしないと、ファイルがSystem32にあるとみなされます。 `MapPath`を見つけることができない人のために

string dllPlugin = "ExamplePlugin.dll"; 
FileInfo dllFileInfo = new FileInfo(MapPath("~/bin/" + dllPlugin)); 
Assembly dllAssembly = Assembly.LoadFile(dllFileInfo.FullName); 
+0

:私はテストに成功している[' HostingEnvironment.MapPath'](https://msdn.microsoft.com/en-us/library/system.web.hosting .hostingenvironment.mappath(v = vs.110).aspx)。 – Alexander

関連する問題