c#从DLL中调用winform中的代码

时间:2015-09-16 12:27:43

标签: c# dll callback

我正在构建许多winform应用程序,我将使用很多垂直菜单(并且由于没有控件已经存在,我必须使用基于RadioButtons的代码动态构建它们)所以我想要构建一个单独的DLL,将负责创建这些菜单,并在每次需要这种菜单时使用此DLL,这是用于动态创建菜单的代码的和平:

//Creating a menubutton for each item :
foreach (MenuItem menuItem in _allItems)
{
var menuButton = CreateMenuBottons(menuItem);
_allMenuButtons.Add(menuButton);
}

// Dynamicly create the RadioButton and turn it into a menuButton

private RadioButton CreateMenuBottons(MenuItem item)
{
var index = _allItems.IndexOf(item);
var menuButton = new RadioButton();

menuButton.Appearance = Appearance.Button;
menuButton.AutoSize = true;
menuButton.Dock = DockStyle.Fill;
...
...
...
...
menuButton.Tag = item.Value;
menuButton.UseVisualStyleBackColor = true;

menuButton.CheckedChanged += Radio_CheckedChanged; //My problem is here !!!

return menuButton;

}

这就是我如何检测菜单上点击了哪个按钮:

private void Radio_CheckedChanged(object sender, EventArgs e)
{
var selectedMenuButton = (RadioButton)sender;
if (selectedMenuButton.Checked)
{
// code that will be excuted when we
// click one menuButton (belongs to the DLL)
// How can i point back to the Exe project
// that is using this DLL !
}
}

我的问题是我将在多个其他项目(winforms)中使用此DLL,并且需要在每个项目中执行的代码将与其余项目不同,因此如何在winform项目中调用方法从DLL(不必更改DLL并重新编译每次我使用它)?

1 个答案:

答案 0 :(得分:-1)

只是代表

您可以定义delegate,指定您要提供的参数

public delegate void MenuButtonClickCallbackDelegate(TypeOfData data);
public MenuButtonClickCallbackDelegate MenuButtonClickCallback;

然后在需要时调用它:

private void Radio_CheckedChanged(object sender, EventArgs e)
{
var selectedMenuButton = (RadioButton)sender;
if (selectedMenuButton.Checked)
{
    if(MenuButtonClickCallback != null)
        MenuButtonClickCallback(parameter);
}
}

这是你从exe中为MenuButtonClickCallback分配函数的方法:

void MenuButtonClicked(TypeOfData data)
{
}
/*
.
.
.
*/
theObject.MenuButtonClickCallback = MenuButtonClicked;

<强>事件

或者您可以提供一个事件(如果可能会调用多个方法)。您必须将MenuButtonClickCallback定义如下:

public event MenuButtonClickCallbackDelegate MenuButtonClickCallback;

方法的分配如下:

void MenuButtonClicked(TypeOfData data)
{
}
void MenuButtonClickedAnotherMethod(TypeOfData data)
{
}
/*
.
.
.
*/
theObject.MenuButtonClickCallback += MenuButtonClicked;
theObject.MenuButtonClickCallback += MenuButtonClickedAnotherMethod;