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

时间:2011-11-09 10:46:05

标签: c# mef

撕掉我的头发试图解决为什么我有这个问题所以希望有人可以提供帮助。

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

我的问题是,当我将插件位置设置为“C:\Users\Administrator\Desktop\ClientPlugins”时,插件会正常加载。如果我将位置更改为“\\XRP-SERVER\Users\Administrator\Desktop\ClientPlugins”,则不会加载插件。

当我在Windows资源管理器中输入“\\XRP-SERVER\Users\Administrator\Desktop\ClientPlugins”时,会找到该位置,插件dll就在那里。

请有人帮忙。

如果您需要更多信息,请与我们联系。

根据建议,我已尝试编辑配置以包含以下内容,但这并未修复问题....

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

亲切的问候

4 个答案:

答案 0 :(得分:8)

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

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

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

另一件需要注意的事情是,当您从网络位置复制文件时,它们通常会在其备用数据流中指定区域。在资源管理器中,可以在查看文件属性时使用“取消阻止”命令将其删除。

或者,您可以以编程方式从备用数据流中删除区域,如here on Mike Hadlow's blog所示。

答案 1 :(得分:2)

我昨天遇到了这个问题并将问题缩小到MEF加载程序集的方式。 创建DirectoryCatalog时,它会创建一个AssemblyCatalog集合。 每个AssemblyCatalog都执行:

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

Assembly.Load的调用会引发沙箱异常(由于我无法解释的原因),因此没有找到任何部分,因为它会无声地捕获错误。

有趣的是,调用Assembly.LoadFrom(<pathToYourDll>)返回Assembly可以正常工作(不会抛出任何异常)。将其与AssemblyCatalog的重载构造函数相结合,该构造函数以Assembly为输入,您可以自行解决!

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

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

希望这有帮助

答案 2 :(得分:2)

只是为了澄清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);

答案 3 :(得分:0)

尝试使用System.IO.Path.PathSeparator而不是\?

或者可能首先将文件提取到客户端位置?

我不太确定他们,但我会尝试一下。