You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()
        {
            // 你的补充代码
        }
    }
}

关键注意点

  1. 原DLL代码中timer1 = 35;是错误写法,需改为timer1.Interval = 35;(单位为毫秒)
  2. 使用委托时,用?.Invoke()可避免未传入委托时的空引用异常
  3. Windows服务中无需处理UI线程同步,若后续涉及UI场景需额外处理线程问题

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:20:48