如何制作符合这个系统的插件DLL

admin | 2026-05-01 22:18 | 阅读 6 次

整个插件系统的核心就一个接口,宿主通过反射发现和加载,非常简单。

  1. 唯一的入口:实现 IReportPlugin

public interface IReportPlugin { string Id { get; } // 全局唯一标识,重复会被跳过 string MenuName { get; } // 顶级菜单名称,同 DLL 内所有插件共享 string DisplayName { get; } // 菜单下拉子项名称,显示给用户 FrameworkElement CreateReportView(); // 返回任意 WPF 控件作为报表界面 }

创建一个 .NET Framework 4.8 类库项目,实现这个接口,把 DLL 放到宿主程序目录下的 plugin/ 文件夹,启动即自动加载。

  1. 两种开发模式

简单模式 — 直接在 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。

  1. 关键引用

┌───────────────────────────────┬───────────────────────────────────────────────┐ │ 引用 │ 用途 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ CimsReporting 宿主项目 │ 获取 IReportPlugin 接口定义 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ Syncfusion WPF(v32.1462.19) │ SfDataGrid(表格)、SfChart(图表)、其他控件 │ ├───────────────────────────────┼───────────────────────────────────────────────┤ │ ClosedXML(可选) │ Excel 导出 │ └───────────────────────────────┴───────────────────────────────────────────────┘

Syncfusion DLL 通过直接程序集引用(非 NuGet),版本必须与宿主一致。

  1. 项目文件配置

SDK 风格 .csproj,核心是 post-build 事件,编译后自动把 DLL 复制到宿主的 plugin/ 目录: └───────────────────────────────┴───────────────────────────────────────────────┘

Syncfusion DLL 通过直接程序集引用(非 NuGet),版本必须与宿主一致。

  1. 项目文件配置

SDK 风格 .csproj,核心是 post-build 事件,编译后自动把 DLL 复制到宿主的 plugin/ 目录:

net48 ...
  1. 宿主发现流程(理解即可,不用关心)

启动 → 扫描 plugin*.dll → Assembly.LoadFrom → 反射找 IReportPlugin 实现 → Activator.CreateInstance → 按 MenuName 分组生成菜单 → 用户点击时调用 CreateReportView() → 创建标签页显示

  1. 建议的项目结构

MyPlugin/ ├── MyPlugin.csproj ├── MyReportPlugin.cs # IReportPlugin 实现,注册所有报表 ├── ViewModels/ │ └── SalesReportViewModel.cs ├── Views/ │ └── SalesReportView.xaml # UserControl,Syncfusion 控件写在这里 └── Services/ └── SalesReportService.cs # 数据查询、导出逻辑

要点总结:实现一个接口,DLL 扔进 plugin 目录,菜单自动出现。 控件的选择和数据获取完全自由,宿主只提供一个标签页容器。

评论 (0)

发表评论
支持 Markdown 格式
暂无评论,快来发表第一条评论吧!