我在编码时似乎遇到了问题。我正在为C#编写一个DLL。在我的DLL中,我需要在函数中放置一些代码。我遇到的问题是我需要在函数中放置的代码是在使用DLL的程序中编写的。例如:
using OtherGuyDLL.dll
public void Function1()
{
OtherGuyEventHandler += DLLFunction;
}
private void DLLFunction(object sender, EventArgs e)
{
ProgramFunction();
}
using MyDLL.dll
public void ProgramFunction()
{
//My code
}
编译MyDLL.dll
时会出现问题。由于ProgramFunction()
当时没有使用DLL,因此Program.cs
不存在而导致错误。反正有吗?
编辑:为了进一步说明,DLLFunction()
实际上是由事件处理程序调用的。我在我的DLL中使用第三方DLL。我希望我的DLL的用户能够指定一些代码,这些代码将在事件期间使用。我的DLL的目的主要是为了易于使用。我已经更新了我的示例代码,以便更好地了解这一点。
答案 0 :(得分:0)
尽管我不是sender/eventArgs
代表的忠实粉丝,但我会继续使用它,因为它已经在使用中。
外部库不具备应用程序的内部知识(包括Program
类的方法),因为这将是循环引用。在编译之前,每个都需要另一个进行编译。
您可以在EventArgs
传递对您希望外部.dll调用的函数的引用。
在此示例中,MyEventArgs
类包含对Action
的引用。当您致电ExecuteCallback
时调用Action
。您还可以将Action
设为公共属性,然后事件处理程序可以直接调用它。
您将在外部库中声明MyEventArgs
。
public class MyEventArgs : EventArgs
{
private readonly Action _callback { get; set;}
public MyEventArgs(Action callback = null)
{
_callback = callback;
}
public void ExecuteCallback()
{
_callback?.Invoke();
}
}
现在举起活动的班级会做
new MyEventArgs(this.ProgramFunction)
(假设提升事件的类与包含ProgramFunction
的事件相同。
我不知道具体细节,但这是一般模式。调用库将函数传递给它,而不是引用的库知道调用哪个方法。