MEF从网络共享文件夹加载插件



撕我的头发试图找出为什么我有这个问题,希望有人能帮助。

我有一个使用MEF加载插件的程序。我希望系统的客户端和服务器部分能够使用相同的插件商店,将位于服务器上。

我的问题是,当我设置插件位置为"C:UsersAdministratorDesktopClientPlugins"插件加载良好。如果我将位置更改为"\XRP-SERVERUsersAdministratorDesktopClientPlugins",则不会加载插件。

当我在windows资源管理器中输入"\XRP-SERVERUsersAdministratorDesktopClientPlugins"时,发现位置和插件dll在那里。

有人能帮帮忙吗?

如果您需要更多的信息,请告诉我。

根据建议,我尝试编辑配置以包含以下内容,但这并没有解决问题....

  <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <runtime>
        <loadFromRemoteSources enabled="true"/>
      </runtime>

亲切的问候火山灰

安全策略通常会禁用加载远程代码(即外部位置上的程序集)。

您可以尝试以下配置更改:

<runtime>
    <loadFromRemoteSources enabled="true"/>
</runtime>

另一件要注意的事情是,当您从网络位置复制文件时,它们通常会在其备用数据流中指定一个Zone。在资源管理器中,当查看文件的属性时,可以通过使用"Unblock"命令来删除。

或者,您可以编程地从备用数据流中删除Zone,如Mike Hadlow的博客所示。

我昨天遇到了这个问题,并将问题缩小到MEF如何加载程序集。当您创建DirectoryCatalog时,它会依次创建一个AssemblyCatalogs集合。每个AssemblyCatalog执行以下操作:

    AssemblyName assemblyName = AssemblyName.GetAssembly();
    Assembly.Load(assemblyName);

Assembly.Load的调用抛出了一个沙盒异常(由于我还不能解释的原因),因此没有找到任何部分,因为它静默地捕获了错误。

有趣的是,调用Assembly.LoadFrom(<pathToYourDll>)返回Assembly工作正常(没有抛出异常)。将它与AssemblyCatalog的重载构造函数(将Assembly作为其输入)结合起来,您就得到了一个解决方案!

因此,我没有使用DirectoryCatalog,而是列出路径中的所有dll,并迭代地创建AssemblyCatalog并将其添加到我的CompositionContainer中。

注意:我在我的App.Config中使用loadFromRemoteSources="true"标志,这是必需的,否则它总是崩溃。

希望能有所帮助

只是为了澄清sebd的回答有效。

这是我使用的最终代码。

string[] files = Directory.GetFiles(ClientPluginStore, "*.dll", SearchOption.TopDirectoryOnly);
AggregateCatalog aggCat = new AggregateCatalog();
aggCat.Catalogs.Add(catalog);
foreach ( string file in files )
{
    Assembly ass = Assembly.LoadFrom(file);
    AssemblyCatalog assCat = new AssemblyCatalog(ass);
    aggCat.Catalogs.Add(assCat);
}
_container = new CompositionContainer(aggCat);

尝试使用System.IO.Path.PathSeparator代替?

或者可以先将文件获取到客户端位置?

我不太确定,但我想试一试。

最新更新