MEF从网络共享文件夹加载插件
本文关键字:文件夹 加载 插件 共享文件 共享 网络 MEF | 更新日期: 2023-09-27 18:14:09
撕我的头发试图找出为什么我有这个问题,希望有人能帮助。
我有一个使用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>
亲切的问候火山灰
安全策略通常会禁用加载远程代码(即外部位置上的程序集)。
您可以尝试以下配置更改:
<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代替'?
或者可以先将文件获取到客户端位置?
我不太确定,但我想试一试。