【问题标题】:Static event doesn't get subscribed in different dll静态事件未在不同的 dll 中订阅
【发布时间】:2012-08-20 22:14:32
【问题描述】:

我有一个生成 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,即带有事件的项目,被加载了两次。我刚刚添加了一个别名,但没有帮助。并且仍然不会解释在 += 之后事件仍然为空。

EDIT 3 我转换了事件,所以我有了添加/删除访问器对。它确实进入了添加。 Handler方法正确获取值(因此不为null),但一旦超出,又为null。

【问题讨论】:

  • 你的项目 3 的 ctor 运行了吗?尝试在注册码处设置断点并检查它是否已运行。从您提供的信息中,我看不出为什么它不应该起作用。
  • 它确实有效。我确实把断点放在那里。这就是我发现 += 不起作用的原因

标签: c# winforms


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多