MEF是.NET的插件化框架,通过Export/Import机制实现组件自动装配。定义IPlugin接口,插件用[Export(typeof(IPlugin))]标记,主程序用[ImportMany]加载插件,DirectoryCatalog扫描目录,CompositionContainer完成组合,支持延迟加载与热更新监控。

插件化开发能让程序在不修改主程序代码的前提下动态加载功能模块,提升系统的可扩展性和维护性。C# 中实现插件化的方式有多种,其中 MEF(Managed Extensibility Framework)是微软官方提供的一种轻量级、声明式的组件组合框架,特别适合构建可扩展的应用程序。
MEF 是 .NET Framework 4.0 引入的一个库,用于创建可扩展的应用程序。它通过“导出”和“导入”的机制,自动发现并加载外部组件(即插件),无需硬编码依赖关系。
核心概念包括:
下面通过一个简单示例展示 MEF 的基本用法。
第一步:安装 MEF
如果你使用的是 .NET Framework 4.0 及以上版本,MEF 已内置在 System.ComponentModel.Composition 命名空间中。对于 .NET Core/.NET 5+,需通过 NuGet 安装:
Install-Package System.ComponentModel.Composition
第二步:定义公共接口
为了让主程序与插件解耦,先定义一个共享接口。通常放在独立的类库中,供主程序和插件引用。
public interface IPlugin
{
string Name { get; }
void Execute();
}
第三步:编写插件(导出组件)
创建一个类库项目作为插件,引用上面的接口和 MEF 相关命名空间。
[Export(typeof(IPlugin))]
public class HelloPlugin : IPlugin
{
public string Name => "Hello 插件";
<pre class='brush:php;toolbar:false;'>public void Execute()
{
Console.WriteLine("HelloPlugin 正在执行!");
}}
这里使用 [Export] 特性将该类标记为可被容器加载的组件。
第四步:主程序中导入并使用插件
在主程序中使用 CompositionContainer 扫描插件目录,自动加载所有符合接口的插件。
class Program
{
[ImportMany] // 导入多个 IPlugin 实例
private IEnumerable<Lazy<IPlugin>> Plugins { get; set; }
<pre class='brush:php;toolbar:false;'>static void Main(string[] args)
{
var program = new Program();
program.LoadPlugins();
program.RunPlugins();
}
private void LoadPlugins()
{
// 指定插件存放目录
var catalog = new DirectoryCatalog("./Plugins", "*.dll");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
private void RunPlugins()
{
foreach (var plugin in Plugins)
{
Console.WriteLine($"加载插件:{plugin.Value.Name}");
plugin.Value.Execute();
}
}}
注意:Lazy<IPlugin> 表示插件是延迟加载的,只有在真正访问 Value 时才会实例化,有助于提升性能。
如果希望程序运行时能自动发现新添加的插件,可以结合文件系统监视器(FileSystemWatcher)定期刷新目录。
var catalog = new DirectoryCatalog("./Plugins", "*.dll");
// 当目录变化时重新扫描
catalog.Changed += (sender, e) =>
{
Console.WriteLine("检测到插件变更,可触发重新加载...");
};
不过 MEF 默认不会自动重新组合,需要手动重建容器或处理刷新逻辑。
Lazy<T> 避免不必要的对象创建。基本上就这些。MEF 让 C# 插件化变得简洁直观,适合中小型扩展系统。虽然现在也有更现代的方案如 AssemblyLoadContext + DI 容器,但 MEF 仍是一个稳定、易上手的选择。
以上就是C#如何实现插件化开发?MEF(Managed Extensibility Framework)框架入门的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号