如何制作符合这个系统的插件DLL
整个插件系统的核心就一个接口,宿主通过反射发现和加载,非常简单。
- 唯一的入口:实现 IReportPlugin
public interface IReportPlugin { string Id { get; } // 全局唯一标识,重复会被跳过 string MenuName { get; } // 顶级菜单名称,同 DLL 内所有插件共享 string DisplayName { get; } // 菜单下拉子项名称,显示给用户 FrameworkElement CreateReportView(); // 返回任意 WPF 控件作为报表界面 }
创建一个 .NET Framework 4.8 类库项目,实现这个接口,把 DLL 放到宿主程序目录下的 plugin/ 文件夹,启动即自动加载。
- 两种开发模式
简单模式 — 直接在 CreateReportView() 里用纯代码构建 WPF 控件树,适合静态展示、快速原型:
public FrameworkElement CreateReportView() { var grid = new Grid(); // 手写布局... var button = new Button ; var dataGrid = new SfDataGrid ; grid.Children.Add(dataGrid); return grid; }
MVVM 模式 — 标准 Service → ViewModel → View 分层,适合有异步数据加载、表格、导出的报表。CreateReportView() 返回一个 UserControl,其 DataContext 绑定到 ViewModel。参考原有的 ReportPluginTemplate。
- 关键引用
┌───────────────────────────────┬───────────────────────────────────────────────┐ │ 引用 │ 用途 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ CimsReporting 宿主项目 │ 获取 IReportPlugin 接口定义 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ Syncfusion WPF(v32.1462.19) │ SfDataGrid(表格)、SfChart(图表)、其他控件 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ ClosedXML(可选) │ Excel 导出 │ └───────────────────────────────┴───────────────────────────────────────────────┘
Syncfusion DLL 通过直接程序集引用(非 NuGet),版本必须与宿主一致。
- 项目文件配置
SDK 风格 .csproj,核心是 post-build 事件,编译后自动把 DLL 复制到宿主的 plugin/ 目录: └───────────────────────────────┴───────────────────────────────────────────────┘
Syncfusion DLL 通过直接程序集引用(非 NuGet),版本必须与宿主一致。
- 项目文件配置
SDK 风格 .csproj,核心是 post-build 事件,编译后自动把 DLL 复制到宿主的 plugin/ 目录:
- 宿主发现流程(理解即可,不用关心)
启动 → 扫描 plugin*.dll → Assembly.LoadFrom → 反射找 IReportPlugin 实现 → Activator.CreateInstance → 按 MenuName 分组生成菜单 → 用户点击时调用 CreateReportView() → 创建标签页显示
- 建议的项目结构
MyPlugin/ ├── MyPlugin.csproj ├── MyReportPlugin.cs # IReportPlugin 实现,注册所有报表 ├── ViewModels/ │ └── SalesReportViewModel.cs ├── Views/ │ └── SalesReportView.xaml # UserControl,Syncfusion 控件写在这里 └── Services/ └── SalesReportService.cs # 数据查询、导出逻辑
要点总结:实现一个接口,DLL 扔进 plugin 目录,菜单自动出现。 控件的选择和数据获取完全自由,宿主只提供一个标签页容器。