如何在C#类库DLL中调用调用方定义的固定方法func_X?
实现DLL调用调用方定义的func_X方法
要让DLL在自身逻辑(包括定时器事件)中调用调用方的func_X方法,核心是通过回调机制实现,下面提供两种最常用的可行方案:
方案一:使用委托(Delegate)
委托是C#中实现回调最直接的方式,适合这种固定方法签名的场景。
步骤1:修改DLL代码
在DLL的Main_Prog类中定义与func_X签名匹配的委托,添加委托字段存储调用方传入的回调,在需要调用的地方触发委托:
using System.Timers; namespace Concheetah_Class { // 定义与func_X匹配的委托 public delegate void FuncXDelegate(); public class Main_Prog { private System.Timers.Timer timer1 = new System.Timers.Timer(); // 存储调用方传入的回调委托 private FuncXDelegate _funcXCallback; // 新增构造函数,接收调用方的回调委托 public Main_Prog(FuncXDelegate funcXCallback) { _funcXCallback = funcXCallback; } public void Main_Start() { Initialize_timer1(); // 触发委托调用func_X _funcXCallback?.Invoke(); } public void Initialize_timer1() { timer1.Elapsed += OnTimedEvent_timer1; timer1.Interval = 35; // 修正原代码错误:需设置Interval属性,单位毫秒 timer1.Start(); } private void OnTimedEvent_timer1(object sender, EventArgs e) { // 定时器事件中调用委托 _funcXCallback?.Invoke(); } } }
步骤2:修改调用方(服务)代码
实例化DLL的Main_Prog时,将自身的func_X方法作为委托传入:
using Concheetah_Class; using System.ServiceProcess; namespace Concheetah_Service_Bahmuller { public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // 传入自身的func_X作为回调委托 Concheetah_Class.Main_Prog main_Prog = new Concheetah_Class.Main_Prog(func_X); main_Prog.Main_Start(); } public void func_X() { // 你的补充代码 } } }
方案二:使用接口(Interface)
如果后续需要扩展多个回调方法,使用接口会更规范、易维护。
步骤1:修改DLL代码
定义包含func_X方法的接口,让Main_Prog类依赖该接口:
using System.Timers; namespace Concheetah_Class { // 定义回调接口 public interface ICallbackHandler { void func_X(); } public class Main_Prog { private System.Timers.Timer timer1 = new System.Timers.Timer(); private ICallbackHandler _callbackHandler; // 构造函数接收实现接口的调用方实例 public Main_Prog(ICallbackHandler callbackHandler) { _callbackHandler = callbackHandler; } public void Main_Start() { Initialize_timer1(); _callbackHandler.func_X(); } public void Initialize_timer1() { timer1.Elapsed += OnTimedEvent_timer1; timer1.Interval = 35; timer1.Start(); } private void OnTimedEvent_timer1(object sender, EventArgs e) { _callbackHandler.func_X(); } } }
步骤2:修改调用方(服务)代码
让Service1类实现DLL定义的ICallbackHandler接口:
using Concheetah_Class; using System.ServiceProcess; namespace Concheetah_Service_Bahmuller { // 实现DLL的回调接口 public partial class Service1 : ServiceBase, ICallbackHandler { public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { // 传入自身实例(已实现接口) Concheetah_Class.Main_Prog main_Prog = new Concheetah_Class.Main_Prog(this); main_Prog.Main_Start(); } // 实现接口要求的func_X方法 public void func_X() { // 你的补充代码 } } }
关键注意点
- 原DLL代码中
timer1 = 35;是错误写法,需改为timer1.Interval = 35;(单位为毫秒) - 使用委托时,用
?.Invoke()可避免未传入委托时的空引用异常 - Windows服务中无需处理UI线程同步,若后续涉及UI场景需额外处理线程问题
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

