3

我有一个生成 dll 的 WinForms 控件项目。还有一个使用第一个项目的第二个 dll 项目(也是 winforms 控件)。还有第三个 winforms 项目,这次是一个表单,它使用第二个项目。所以[第三个项目] <>-----> [第二个项目] <>--------> [第一个项目]

第一个项目公开了一个静态事件。我正在尝试从第三个项目订阅该事件。在 += 调用之后,该事件保持为空(不是订阅)。

为什么不订阅?是因为 Winforms 控件有自己的线程吗?FirstProject 用户控件是在某个时间点动态创建的。但我希望静态能够正常工作,而无需做任何其他事情,

项目一

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。

4

2 回答 2

0

静态事件应该可以正常工作。尝试调试您的代码以确保正在调用事件注册并且事件本身按预期触发。该事件不关心线程。无论哪种方式,它都会接受注册。但是,如果您尝试在 UI 线程之外的线程上编辑表单,线程将导致异常。

于 2012-08-21T02:28:27.227 回答
0

原因将在我的EDIT 2中。因为是静态事件,所以加载两次 dll(两个不同的路径)会创建两个不同的静态事件(或两个不同的处理程序)。我的EDIT 3清楚地表明该事件正在被订阅。

一旦我强制第三个项目(订阅静态事件的那个)从与创建事件的项目相同的位置加载 dll(我不想使用 GAC),一切正常。

于 2012-08-21T18:39:40.537 回答