2011-11-09 71 views
8

把我的头发拉出来试图弄清楚为什么我有这个问题,所以希望有人可以帮忙。MEF从网络共享文件夹加载插件

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

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

当我在窗口资源管理器中输入“\\XRP-SERVER\Users\Administrator\Desktop\ClientPlugins”时,找到该位置,并且插件DLL在那里。

请有人帮忙。

让我知道你是否需要任何信息。

由于每一个建议,我已经尝试修改配置包括以下但这并没有固定的问题....

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

亲切的问候

回答

2

昨天我遇到了这个问题,并将问题缩小到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”标志,它是必需的,否则它总是崩溃。

希望这可以帮助

+0

Im在这个过程中试试这个,并且和你在一起,直到你将AssemblyCatalog添加到CompositionContainer中。我无法在CompositionContainer上看到一个添加方法。是否请你多解释一下这一点? – user589195

+0

它确定我已经制定了你需要创建一个aggregateCatalogue然后添加你的assemblyCataglogues到它然后添加你的aggregateCatalogue到compositionContainer – user589195

+0

请让我知道,如果你找出为什么这个工程和标准方法doesnt :)我敢说微软会有兴趣知道aswell :)再次感谢回答:) – user589195

0

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

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

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

+0

谢谢我会尝试路径分隔符。未来的任务是如果客户端不能访问共享位置,则通过wcf从服务器流式传输插件。我想先让共享位置工作,并想知道它为什么不是:) – user589195

+0

另一件事是,当我想到它时:使用“file://”? – Anton

+0

我检查了我提供的格式是C#可以读取的路径。 int fCount = Directory.GetFiles(“\\\\ XRP-SERVER \\ Users \\ Administrator \ Desktop \\ ClientPlugins”,“*。*”,SearchOption.TopDirectoryOnly).Length; Console.WriteLine(fCount); 这返回1这是插件DLL – user589195

8

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

你可以试试下面的配置变化:

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

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

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

+0

当我看到这一点时,我的眼睛亮起,因为我认为它会工作。看起来不像它已经完成:(我已经把它放在配置文件中,并且在使用'\\ XRP-SERVER \ Users \ Administrator \ Desktop \ ClientPlugins'路径时它仍然不会加载任何其他想法? – user589195

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);