Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试使用MEF加载插件时出错_C#_Mef - Fatal编程技术网

C# 尝试使用MEF加载插件时出错

C# 尝试使用MEF加载插件时出错,c#,mef,C#,Mef,控制台应用程序尝试使用MEF从特殊插件文件夹加载插件。 另一方面,应用程序的二进制文件夹包含PluginAdd.dll的旧版本。 控制台应用程序失败,出现错误: Unhandled Exception: System.Reflection.ReflectionTypeLoadException: Unable to lo ad one or more of the requested types. Retrieve the LoaderExceptions property fo r more

控制台应用程序尝试使用MEF从特殊插件文件夹加载插件。 另一方面,应用程序的二进制文件夹包含PluginAdd.dll的旧版本。 控制台应用程序失败,出现错误:

Unhandled Exception: System.Reflection.ReflectionTypeLoadException: Unable to lo
ad one or more of the requested types. Retrieve the LoaderExceptions property fo
r more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at System.ComponentModel.Composition.Hosting.AssemblyCatalog.get_InnerCatalog
()
我如何才能解决问题和请求从MEF加载插件只从专用文件夹,而不是从二进制文件夹

加载到git项目的示例MEF加载问题:

下一个代码加载的插件:

public class Client
{
    [ImportMany]
    public Lazy<ICommandPlugin, IDictionary<string, object>>[] CommandPlugins { get; set; }

    public void LoadPlugins()
    {
        var aggregateCatalog = new AggregateCatalog();               

        var pluginAssemblyCatalog = new AssemblyCatalog(@"..\..\..\@PluginBinaries\PluginAdd.dll");            
        aggregateCatalog.Catalogs.Add(pluginAssemblyCatalog);

        var container = new CompositionContainer(aggregateCatalog);
        container.ComposeParts(this);
    }
}
应用程序的配置文件包含插件文件夹的路径:

<probing privatePath="..\..\..\@PluginBinaries"/>
UPD1添加了完整的异常堆栈跟踪

Unhandled Exception: System.Reflection.ReflectionTypeLoadException: Unable to lo
ad one or more of the requested types. Retrieve the LoaderExceptions property fo
r more information.
   at System.Reflection.RuntimeModule.GetTypes(RuntimeModule module)
   at System.Reflection.RuntimeModule.GetTypes()
   at System.Reflection.Assembly.GetTypes()
   at System.ComponentModel.Composition.Hosting.AssemblyCatalog.get_InnerCatalog
()
   at System.ComponentModel.Composition.Hosting.AssemblyCatalog.GetExports(Impor
tDefinition definition)
   at System.ComponentModel.Composition.Hosting.AggregateCatalog.GetExports(Impo
rtDefinition definition)
   at System.ComponentModel.Composition.Hosting.CatalogExportProvider.InternalGe
tExportsCore(ImportDefinition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.CatalogExportProvider.InnerCatal
ogExportProvider.GetExportsCore(ImportDefinition definition, AtomicComposition a
tomicComposition)
   at System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore
(ImportDefinition definition, AtomicComposition atomicComposition, IEnumerable`1
& exports)
   at System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExports
Core(ImportDefinition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore
(ImportDefinition definition, AtomicComposition atomicComposition, IEnumerable`1
& exports)
   at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(Import
Definition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.AggregateExportProvider.GetExpor
tsCore(ImportDefinition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore
(ImportDefinition definition, AtomicComposition atomicComposition, IEnumerable`1
& exports)
   at System.ComponentModel.Composition.Hosting.CompositionContainer.GetExportsC
ore(ImportDefinition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore
(ImportDefinition definition, AtomicComposition atomicComposition, IEnumerable`1
& exports)
   at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(Import
Definition definition, AtomicComposition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ImportEngine.TryGetExports(Expor
tProvider provider, ComposablePart part, ImportDefinition definition, AtomicComp
osition atomicComposition)
   at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportSub
set(PartManager partManager, IEnumerable`1 imports, AtomicComposition atomicComp
osition)
   at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportsSt
ateMachine(PartManager partManager, ComposablePart part)
   at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImports(P
artManager partManager, ComposablePart part, Boolean shouldTrackImports)
   at System.ComponentModel.Composition.Hosting.ImportEngine.SatisfyImports(Comp
osablePart part)
   at System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.<>c
__DisplayClass2.<Compose>b__0()
   at System.ComponentModel.Composition.Hosting.CompositionServices.TryInvoke(Ac
tion action)
   at System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Com
pose(CompositionBatch batch)
   at System.ComponentModel.Composition.Hosting.CompositionContainer.Compose(Com
positionBatch batch)
   at System.ComponentModel.Composition.AttributedModelServices.ComposeParts(Com
positionContainer container, Object[] attributedParts)
   at MEF_loading_issue.Client.LoadPlugins() in d:\My\MyProjects\@TechSugar\Tech
Sugar.Samples\trunk\MEF\MEF\MEF-loading-issue\Program.cs:line 40
   at MEF_loading_issue.Program.Main() in d:\My\MyProjects\@TechSugar\TechSugar.
Samples\trunk\MEF\MEF\MEF-loading-issue\Program.cs:line 19
UPD2添加了带有异常消息的屏幕

UPD3中描述的问题相同,但未找到确切答案找到解决方法: 而不是

var pluginAssemblyCatalog = new AssemblyCatalog(@"..\..\..\@PluginBinaries\PluginAdd.dll");
可以使用

var pluginAssemblyCatalog = new AssemblyCatalog(Assembly.LoadFrom(@"..\..\..\@PluginBinaries\PluginAdd.dll"));
在这种情况下,MEF从专用文件加载插件,而不是从二进制文件夹加载插件。

找到了一个解决方法: 而不是

var pluginAssemblyCatalog = new AssemblyCatalog(@"..\..\..\@PluginBinaries\PluginAdd.dll");
可以使用

var pluginAssemblyCatalog = new AssemblyCatalog(Assembly.LoadFrom(@"..\..\..\@PluginBinaries\PluginAdd.dll"));

在这种情况下,MEF从专用文件加载插件,而不是从二进制文件夹加载插件。

加载上下文通常比从上下文加载更可取。因此,当MEF从文件加载程序集时,它将首先获取程序集名称,然后尝试对其执行assembly.load以在加载上下文中加载它。仅当此操作失败时,才会在LoadFrom上下文中加载程序集

因此,加载插件的旧版本的原因是因为该版本在加载上下文中可用,MEF更喜欢该版本


最好是从应用程序的二进制文件夹中删除插件的旧版本。我不知道它为什么在那里,所以我不知道这是否是您的选择。

加载上下文通常比LoadFrom上下文更可取。因此,当MEF从文件加载程序集时,它将首先获取程序集名称,然后尝试对其执行assembly.load以在加载上下文中加载它。仅当此操作失败时,才会在LoadFrom上下文中加载程序集

因此,加载插件的旧版本的原因是因为该版本在加载上下文中可用,MEF更喜欢该版本


最好是从应用程序的二进制文件夹中删除插件的旧版本。我不知道它为什么在那里,所以我不知道这是否是您的选择。

您能提供您的异常的LoaderExceptions的内容吗?所有有用的信息都是内置的完整堆栈跟踪。MEF失败,因为尝试从二进制文件夹加载旧插件。如何要求它仅从必要的文件夹加载插件?您添加了stacktrace,这是LoaderExceptions的消息,这很有趣。屏幕上添加了消息和其他异常的详细信息,因此有趣的部分是方法[…]没有实现。您可以在这里找到答案:您能提供您的异常的LoaderExceptions的内容吗?所有有用的信息都是内置的完整堆栈跟踪。MEF失败,因为尝试从二进制文件夹加载旧插件。如何要求它仅从必要的文件夹加载插件?您添加了stacktrace,这是LoaderExceptions的消息,这很有趣。屏幕上添加了消息和其他异常的详细信息,因此有趣的部分是方法[…]没有实现。您可以在这里找到答案:好的,现在我更好地理解了Load和LoadFrom之间的区别,但不清楚为什么我要定义程序集文件的确切路径,但MEF可以从默认上下文中获取路径并加载程序集。@构造函数从文件中获取程序集名称,并尝试执行程序集。首先加载该名称。这就是它能够选择加载上下文的方式。您可以在这里看到LoadAssembly方法中的代码:好的,现在我更好地理解了Load和LoadFrom之间的区别,但不清楚为什么要定义程序集文件的确切路径,但是MEF可以从默认上下文中查找路径并加载程序集。@构造函数从文件中获取程序集名称并尝试执行程序集。首先加载该名称。这就是它能够选择加载上下文的方式。您可以在这里看到LoadAssembly方法中的代码: