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

C# MEF从网络共享文件夹加载插件,c#,mef,C#,Mef,我拼命想弄明白我为什么会有这个问题,希望有人能帮上忙 我有一个使用MEF加载插件的程序。我希望系统的客户端和服务器部分能够使用位于服务器上的相同插件存储 我的问题是,当我将插件位置设置为“C:\Users\Administrator\Desktop\ClientPlugins”时,插件加载良好。如果我将位置更改为“\\XRP-SERVER\Users\Administrator\Desktop\ClientPlugins”,则不会加载插件 当我在windows资源管理器中输入“\\XRP-SER

我拼命想弄明白我为什么会有这个问题,希望有人能帮上忙

我有一个使用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>

问候


Ash

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

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


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

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

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

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

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


或者,您可以通过编程从备用数据流中删除区域,如图所示。

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

    AssemblyName assemblyName = AssemblyName.GetAssembly();
    Assembly.Load(assemblyName);
调用
Assembly.Load
会引发沙盒异常(原因我还无法解释),因此找不到任何部件,因为它会自动捕获错误

有趣的是,调用
Assembly.LoadFrom()
返回
程序集
效果很好(不会引发异常)。将其与重载的
AssemblyCatalog
构造函数相结合,该构造函数将
Assembly
作为其输入,您就找到了一个解决方法

因此,我没有使用
目录
,而是列出路径中的所有DLL,并迭代创建
汇编目录
,并将其添加到我的
合成容器

注意:我在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);

谢谢,我要试试路径分隔器。未来的任务是,如果客户端无法访问共享位置,则通过wcf从服务器传输插件。我想首先让共享位置工作,并想了解为什么它不工作:)另一件事是,当我想到它时:使用“file://”?我已经检查了我是否以C#可以读取的格式提供了路径。int fCount=Directory.GetFiles(“\\\\XRP-SERVER\\Users\\Administrator\\Desktop\\ClientPlugins”,”,SearchOption.TopDirectoryOnly)。长度;控制台写入线(fCount);这返回1,这是插件dllso,反斜杠就是答案?当我看到这个时,我的眼睛亮了起来,因为我认为它会工作。但看起来它并没有做到:(我已将其放置在配置中,但在使用“\\XRP-SERVER\Users\Administrator\Desktop\ClientPlugins”路径时,它仍然无法加载。还有其他想法吗?我正在尝试此方法,并且一直支持您将AssemblyCatalog添加到CompositionContainer中。我在CompositionContainer上看不到add方法。您可以吗请再解释一下?没关系,我发现你需要创建一个aggregateCatalogue,然后将你的AssemblyCatagogue添加到其中,然后将你的aggregateCatalogue添加到compositionContainer。如果你知道为什么这样做有效而标准方法无效,请告诉我:)我想微软也会有兴趣知道:)再次感谢你的回答:)我看了反射器,但找不到原因。我想这与Load和LoadFrom之间的上下文差异有关(请参阅)。自从上一次回答之后,我还发现LoadFrom可能很危险,我遇到了这个问题:使用LoadFrom可以加载两次相同的DLL,并导致奇怪的行为。如果要使用LoadFrom:,则必须严格要求)