我有一个生成dll的WinForms控件项目。还有第二个dll项目(也是winforms控件)使用第一个项目。有一个第三个winforms项目,这次是一个使用第二个项目的表单。所以[第三个项目]<> ------> [第二个项目]<> --------> [第一个项目]
第一个项目公开了一个静态事件。我正试图从第三个项目订阅该事件。在+ =调用之后,事件保持为空(不是订阅)。
为什么不订阅?是因为Winforms控件有自己的线程吗? FirstProject用户控件是在某个时间点动态创建的。但我希望静态能够正常工作,而不做任何其他事情,
项目1
namespace Something
{
public partial class FirstClass : UserControl
{
...
public delegate void EventHandler();
public static event EventHandler MyEvent;
...
}
}
项目3
namespace Another
{
public partial class ThirdClass : Form
{
...
public ThirdClass()
{
....
Something.FirstClass.MyEvent += new Something.FirstClass.EventHandler(MyHandler);
}
public void MyHandler()
{
}
...
}
}
修改 我已经创建了一个带有基础知识的小应用程序来获取三个项目和静态事件。它有效。因此,其他事情正在发生。
编辑2 包含第一个项目的dll,即带有事件的项目,正在加载两次。我刚刚添加了一个别名,但没有帮助。并且仍然不会在+ =事件之后仍然无法解释。
编辑3 我转换了事件,因此我有添加/删除访问器对。它确实进入了添加。 Handler方法正确获取值(因此没有null),但一旦它出去,再次为null。
答案 0 :(得分:0)
静态事件应该可以正常工作。尝试调试代码以确保调用事件注册并且事件本身按预期触发。该事件不关心线程。它将接受任何一种方式的注册。但是,如果您尝试在UI线程之外的线程上编辑表单,则线程将导致异常。
答案 1 :(得分:0)
原因在于我的 EDIT 2 。因为是一个静态事件,所以加载两次dll(两个不同的路径)创建了两个不同的静态事件(或两个不同的处理程序)。我的 EDIT 3 清楚地表明该活动正在订阅。
一旦我强制第三个项目(订阅静态事件的那个)从与创建事件的项目相同的位置加载dll(我不想使用GAC),一切都有效。