Tag: mef

使用MEF延迟加载DLL

我正在用MEF做我的第一个项目,我很难理解如何使用延迟加载。 我的代码是 – public static class MefLoader { private static CompositionContainer Container; [ImportMany(typeof(IControlModule), AllowRecomposition = true)] private static IEnumerable<Lazy> DllList { get; set; } static MefLoader() { var catalog = new AggregateCatalog(); catalog.Catalogs.Add(new DirectoryCatalog(“.”)); Container = new CompositionContainer(catalog); } 我理解大多数如何使用MEF,除了我没有看到如何初始化DllList对象。 我想使用延迟加载,因为在最终系统中,我们有很多选项,任何时候都只会使用大约10%。

Visual Studio MEF扩展 – 强制边缘字形要更新或重绘

我正在编写的扩展程序起源于演练:创建由Microsoft提供的Margin Glyph示例: https : //msdn.microsoft.com/en-us/library/ee361745.aspx 一切正常,除了我试图触发重绘或更新边缘字形,每当我用来决定绘制字形的数据更改时。 基本上我在工具窗口中有一个按钮,当用户单击按钮时,我想要一个字形出现在边距中。 现在,它不会出现,直到您滚动并返回,或显然关闭并重新加载文档。 我研究过这个,并且看过一些使用IViewTaggerProvider而不是ITaggerProvider的代码示例。 在这些情况下,似乎可以将LayoutChanged事件的处理程序添加到ITagger派生类中,该类还包含GetTags方法。 但是我无法成功将代码从使用ITaggerProvider切换到IViewTaggerProvider,扩展程序在运行时崩溃了。 我不知道这是否会导致解决方案的变化,或者是否是不必要的。 如何强制字形被渲染? 我可以提出某种类型的事件来强制执行GetTags代码吗? 我如何从课外提出这个事件? 例如从工具窗口?

MEF需要.NET 4吗?

我正在使用Visual Studio 2010,尝试创建一个MEF应用程序。 这需要.NET 4.0还是我可以定位.NET 2.0?

在mef中卸载dll文件

我有一些插件作为DLL文件。 我的应用程序加载DLL并运行正常。 但是当我尝试删除旧插件并用新插件替换它时,它不允许我这样做。 因为它已被应用程序加载。 我发现通过使用appdomain,我们可以做到这一点。 但我无法找到使用mef的解决方案。 我需要一个可以在mef上运行的代码。 下面是我的代码,用于加载插件。 //Creating an instance of aggregate catalog. It aggregates other catalogs var aggregateCatalog = new AggregateCatalog(); //Build the directory path where the parts will be available var directoryPath = “Path to plugins folder”; //Load parts from the available dlls in the specified path using the directory catalog var […]

如何读取DLL插件中的MEF元数据而不将整个DLL复制到内存中?

背景: 我有兴趣使用MEF在使用C#和.NET 4.0的WinForm应用程序中提供插件架构,但我不清楚几件事情。 第一:我还没有在C#中构建DLL的工作,我对DLL程序集的概念以及DLL如何正常加载到内存中有点模糊(意思是,所有一次或根据需要一块一块) 意图: 该程序将是一个机器硬件控制框架,将由一个主要的WinForm GUI组成,这是一个具有基本工具栏,菜单等的通用环境 – 但没有批量GUI内容。 (想想:MDI Parent,但实际上并非如此)。 插件提供特定机器的所有控件。 许多可能的插件中的每一个都可能包含30到50个大型UserControl,每个用户控件都包含许多WinForm控件和大量支持代码,构成了各种机器控制面板。 这意味着主程序是一个轻量级的通用框架,插件包含将在主程序用户界面中显示的大量GUI控件和function,包括许多图标,图像和其他资源。 这将使插件DLL可能非常大。 目标是允许用户从菜单中选择一个插件,然后在选择时加载并运行插件,然后插件将大部分空的主GUI填充面板,菜单和工具箱。 为此,我需要首先从每个插件中提取元数据以填充程序的初始菜单,其中包括插件标题,描述,图标,版本号和其他信息位。 以下是问题: 使用MEF,如果我尝试从存储在插件文件夹中的每个大型DLL中读取元数据,是否会在访问元数据值之前将整个DLL复制到内存中? 如果是这样,有没有办法打开每个DLL文件,只读取元数据到内存中构建初始菜单 – 然后通过MEF加载完整选定的DLL? 我假设用于通过MEF读取插件的典型DirectoryCatalog和AggregateCatalog模板将所有发现的DLL复制到内存中并将它们存储在目录集合中。 DLL是否包含一个连续的代码块(程序集),或者它们是否可以包含多个单独的块,这些块根据需要单独索引并复制到内存中(多个程序集)? 我可能不了解基本面,也许可能会混淆条款。 我将非常感谢对MEF,DLL和程序集的加载行为的任何了解。 谢谢 !

mef enum出口和建筑

我想用mef制作我的插件子系统,但我有几个问题,因为我是csharp和mef的新手( 我想做的事: 每个插件都可以创建自己的接口IPlugin1,IPlugin2 …… 每个接口都必须具有指定的functionLoad,Unload 使用mef我想枚举所有导出并调用加载/卸载 问题: 一个。 我的解决方案是否良好,如果没有,我如何改进它(通过使用其他东西)? 湾 如何使用mef枚举所有导出并调用指定的接口函数? 我会感谢所有链接和评论家。 谢谢大家。

MEF的对象破坏问题

我使用静态变量来保存对象的数量。 在构造函数中,我增加了这个变量。 这样我知道创建了多少个对象实例。 使用这些对象后,它们会被解除引用。 我怀疑MEF是否持有对这些对象的引用,因此我强制GC进行清理(使用GC.Collect()方法)。 我希望在下一个对象创建时,这个变量从零开始,但它从最后一个数字开始重新开始。 我在destructor放置了一个用于跟踪的日志记录机制,只有在应用程序关闭后才会销毁对象。 我可以假设MEF已经创建了对这些对象的其他引用吗? 我使用MEF和ExportFactory来创建我的对象 编辑: 也许应该用ExportLifetimeContext做些什么?

.NET Core(或ASP.NET 5)中是否有MEF的替代品

我们知道.NET Core(开源组件)只是完整.NET Framework的一个子集,而ASP.NET 5(和MVC 6)是基于.NET Core构建的。 这是否意味着ASP.NET 5中没有Managed Extensibility Framework(MEF)? 如果是这样,.NET Core中是否有可用的动态可扩展性替换? 我有许多使用MEF来动态加载插件和外部集成的应用程序,如果他们因为使用MEF而被锁定在.NET Framework中,那将是一个遗憾。

单个MEF DLL的多个实例

显然.NET 4.0没有非SL的PartCreator / ExportFactory。 这是我认为我需要的东西。 我想知道是否有人可以帮助我(请举例说明)如何在DLL中创建EXPORTED类型的多个实例。 基本上我说我有一个包含ConsoleLogger类型的DLL,它使用接口ILogger(我通过MEF导入/导出)…如何随时创建一个ConsoleLogger实例? 也..这甚至可能吗?

将MEF与C#一起使用,如何从插件中调用主机上的方法?

我正在尝试使用Managed Extensibility Framework(MEF)框架向我的C#应用​​程序添加插件可扩展性,到目前为止它还可以; 我有我的主/主机应用程序从定义的文件夹加载插件,并可以从主应用程序调用他们的方法等。 宿主应用程序和插件都引用了一个单独的dll程序集,其中包含所有项目通用的接口。 这工作正常,我可以调用/与主应用程序的插件交互。 但是,我也希望能够从插件中与宿主应用程序进行交互,但似乎无法了解这是如何完成的。 我希望能够从我的插件中获取/设置/执行主应用程序中的导出属性和方法。 目前我只能从主应用程序“发言”到插件,而不是相反。 我的代码到目前为止: 接口DLL namespace MefContracts { [InheritedExport] public interface IPlugin { String DoWork(); } public class Class1 { public IPlugin plugin { get; set; } } } 主要/主机应用程序 namespace MyMEF { class clsMEF { private CompositionContainer _container; [Import(typeof(MefContracts.IPlugin))] public MefContracts.IPlugin plugin; public clsMEF() { Compose(); } void […]