我要制作一个桌面应用程序,可以通过添加/删除dll(每个文件由dll处理)或通过配置文件来添加/删除模块。
我的目标是拥有像eclipse ide这样的应用程序,一开始会有一些基本功能(eclipse basic),然后其他功能可能会作为插件安装,成为一个功能齐全的应用程序。
进行一些搜索,最后得到Managed Extensibility Framework (MEF)。问题是MEF似乎已暂停支持很长时间,并且没有很多应用程序使用它。谁能告诉我为什么,我应该继续吗?我在WinForm上有很多经验,但是有WPF。
如果还有其他方法,也请让我知道。
答案 0 :(得分:2)
如果要避免依赖于任何可扩展性框架(例如MEF或Prism),也可以在程序集加载中使用裸反射。这是它的工作方式:
您可以在以下文档页面中了解这种方法:
学习起来似乎很多,但是过了一会儿就很简单了。
答案 1 :(得分:1)
您应该看看Prism。这是一个开放源代码框架,用于在WPF,Windows 10 UWP和Xamarin Forms中构建松耦合,可维护和可测试的XAML应用程序。
它支持使用配置添加模块,如以下示例所示:https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/07-Modules%20-%20AppConfig
答案 2 :(得分:1)
MEF实际上是这种应用程序体系结构的一种好方法。说“没有那么多的应用程序使用MEF”是不正确的,因为使用MEF的(可能)最大且最广为人知的应用程序是Visual Studio本身(从12.0-2013版本开始)。
现在,关于MEF有些误解。有3种(很好的,三个半)MEF版本。这常常使人感到困惑。
让我尝试解释一下:
System.ComponentModel.Composition
。
System.Composition
。
Microsoft.VisualStudio.Composition
。
这些MEF版本当然有一些differences,但是这些版本中的任何一个都可以用于基于动态插件的应用程序。根据您的需求,可以选择其中之一。如今,我建议使用MEF 2.0(NuGet MEF)或VS-MEF。我在VS-MEF方面具有实践经验,并对它的功能和性能完全满意。
但是,MEF不是唯一的方法。总有一个选项可以为基于插件的应用程序创建本地平台。实际上,许多公司都采用这种方式。
另一种可能性(如果您具有基于IoC的体系结构)是使用一些可用的IoC容器(如Unity),并在需要时手动扩展其功能。
答案 3 :(得分:1)
首先,MEF是.NET Framework的一部分,并且在.NET Core中可用。 MEF还活着,并在许多项目中使用。最新更改是一个月前发布的https://www.nuget.org/packages/System.Composition/1.3.0-preview3.19128.7,当然还有github(请参见System.Composition。*)。
第二,我同意@ mm8。棱镜是一个不错的选择。但是您可能会看到Win Application Framework (WAF)。
如描述中所述,WAF支持:
- WPF(Windows Presentation Foundation)
- UWP(通用Windows平台)
- 核心(对所有基于.NET的应用程序的基本支持)
有关配置模块化的更多详细信息,请参见Modular Architecture部分。 WAF在引擎盖下使用MEF。查看配置https://github.com/jbe2277/waf/blob/master/src/System.Waf/Samples/InformationManager/Assembler/App.xaml.cs
的好例子示例中使用MEF和WAF的部分代码:
// An aggregate catalog that combines multiple catalogs
var catalog = new AggregateCatalog();
// Add the WinApplicationFramework assembly to the catalog
catalog.Catalogs.Add(new AssemblyCatalog(typeof(ICustomService).Assembly));
// Load module assemblies from files *.Presentation.dll and *.Applications.dll
foreach (string moduleAssembly in GetCustomModuleAssemblies())
{
catalog.Catalogs.Add(new AssemblyCatalog(moduleAssembly));
}
var container = new CompositionContainer(catalog, CompositionOptions.DisableSilentRejection);
var batch = new CompositionBatch();
batch.AddExportedValue(container);
container.Compose(batch);
// Initialize all presentation services
var presentationServices = container.GetExportedValues<IPresentationService>();
foreach (var presentationService in presentationServices) { presentationService.Initialize(); }
// Initialize and run all module controllers
moduleControllers = container.GetExportedValues<IModuleController>();
foreach (var moduleController in moduleControllers) { moduleController.Initialize(); }
foreach (var moduleController in moduleControllers) { moduleController.Run(); }
第三,我建议为桌面UI而不是WinForms使用WPF或Avalonia(跨平台.NET UI框架)。