我如何传递一个函数到一个c#类dll,我从另一个c#应用程序调用?该函数在调用dll的应用程序中定义



我在我的c#服务应用程序中调用一个c#类dll。但是在类dll中,在某些时候必须执行一个在调用者应用程序上定义的方法。所以我想传递,像参数一样,整个方法到dll,必须在特定的时间执行。

具有挑战性的一点是,该函数必须在dll中以计时器事件的形式执行。在这种情况下如何传递函数呢?

我调用dll的c#应用程序。

using MyClassLibrary; // my dll
namespace Concheetah_Service_Bahmuller
{
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
MyClassLibrary.Main_Prog main_Prog = new MyClassLibrary.Main_Prog();
main_Prog.Main_Start(); // starting point of my dll            
}
public void func_passed()
{
// some supplementary code
}
}
}

MyClassLibrary

System.Timers.Timer timer1 = new  System.Timers.Timer();
public void Main_Start()
{    
Initialize_timer1();  // starting point of the dll
}
public void Initialize_timer1()
{
timer1.Elapsed += new ElapsedEventHandler(OnTimedEvent_timer1);
timer1 = 35;
timer1.Start();
}
private void OnTimedEvent_timer1(object sender, EventArgs e)
{
//some code
func_passed(); // at this point my passed function should be executed.
}

看看委托、匿名方法和Lambda表达式。

请注意,只要您有对其他项目或程序集的引用,并且您想要访问的内容是公共的,那么代码是否在另一个DLL (c#术语中的另一个程序集)中都没有区别。

像这样更改库(只显示更改的内容):

private Action _timerAction;
public void Main_Start(Action timerAction)
{    
_timerAction = timerAction;
Initialize_timer1();
}
private void OnTimedEvent_timer1(object sender, EventArgs e)
{
//some code
_timerAction();
// If _timerAction can be null, call it like this instead:
_timerAction?.Invoke();
}

然后在应用程序中像这样调用它:

main_Prog.Main_Start(func_passed); 

确保不要在func_passed后面加上大括号(),因为我们不想在这里调用函数,我们想把函数本身作为参数传递。


有不同的Action和Func委托具有不同数量的参数。与Action不同,Func的返回类型与void不同。


另一种解决问题的方法是让库公开一个应用程序可以订阅的事件。

参见:Handle and raise events

相关内容

  • 没有找到相关文章

最新更新