将插件DLL加载到WebAPI应用程序中

时间:2017-11-09 17:08:13

标签: c# asp.net-web-api dll

我必须将插件DLL加载到WebAPI应用程序中。所以我创建了一个自定义IPlugin接口,它公开了插件可以对现有控制器内部做出反应的操作,而且我想允许插件DLL提供更多路由。所以我无法将DLL添加到References列表中,我必须根据配置文件条目动态加载它。

因此,我将ExamplePlugin.DLL添加到我的WebAPI的bin目录(C:\users\Alexander\Source\Repos\Testbed\WebAPI\bin)并从web config的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 :   Das System kann die angegebene Datei nicht finden。 (Ausnahme von   HRESULT:0x80070002)

为什么我的WebAPI DLL在错误的文件夹中搜索,我该如何解决?

1 个答案:

答案 0 :(得分:1)

您需要将路径映射到应用程序文件夹,否则它将假定该文件位于System32中。

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