3

dll を生成する WinForms コントロール プロジェクトが 1 つあります。最初のプロジェクトを使用する 2 番目の dll プロジェクト (winforms コントロールも) があります。2 番目のプロジェクトを使用する 3 番目の winforms プロジェクト (今回はフォーム) があります。ということで【第三企画】<>------>【第二企画】<>-------->【第一企画】

最初のプロジェクトは、静的イベントを公開します。3 番目のプロジェクトからそのイベントをサブスクライブしようとしています。+= 呼び出しの後、イベントは null (サブスクリプションではない) のままです。

購読していないのはなぜですか?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()
     {
     }
     ...
   }
 }

編集 3 つのプロジェクトと静的イベントを取得するための基本を備えた小さなアプリケーションを作成しました。そして、それは機能します。したがって、何か他のことが起こっています。

編集 2 最初のプロジェクト (イベントのあるプロジェクト) を含む dll が 2 回読み込まれていました。エイリアスを追加しましたが、役に立ちませんでした。+= の直後にイベントがまだ null であることはまだ説明されていません。

EDIT 3イベントを変換したので、追加/削除アクセサーのペアがあります。それは追加に入ります。Handler メソッドは値を正しく取得します (したがって null はありません) が、外部に出ると再び null になります。

4

2 に答える 2

0

そしてその理由は私のEDIT2にあります。は静的イベントであるため、dllを2回ロードすると(2つの異なるパス)、2つの異なる静的イベント(または2つの異なるハンドラー)が作成されていました。私のEDIT3は、イベントがサブスクライブされていることを明確に示していました。

3番目のプロジェクト(静的イベントをサブスクライブしているプロジェクト)に、イベントを作成しているプロジェクト(GACを使用したくなかった)と同じ場所からdllをロードするように強制すると、すべてが機能しました。

于 2012-08-21T18:39:40.537 に答える
0

静的イベントは問題なく動作するはずです。コードをデバッグして、イベント登録が呼び出され、イベント自体が期待どおりに発生することを確認してください。イベントはスレッドを気にしません。どちらでも登録を受け付けます。ただし、UI スレッド以外のスレッドでフォームを編集しようとすると、スレッド化によって例外が発生します。

于 2012-08-21T02:28:27.227 に答える