ホームページ > バックエンド開発 > C++ > C# ではイベント ハンドラーが盗まれて実行時に再割り当てされる可能性がありますか?

C# ではイベント ハンドラーが盗まれて実行時に再割り当てされる可能性がありますか?

Barbara Streisand
リリース: 2024-12-30 21:06:09
オリジナル
325 人が閲覧しました

Can Event Handlers Be Stolen and Reassigned at Runtime in C#?

イベント ハンドラーの盗用: ランタイムの旅

はじめに:

ソフトウェア開発では、1 つのコントロールからイベント ハンドラーを割り当てることが必要な場合があります。実行時に別のものに。この記事では、このような操作の実現可能性を掘り下げ、潜在的な警告と利用可能な回避策の両方を調査します。

元の質問:

元の質問では、割り当てられたイベント ハンドラーを転送する方法を見つけようとしました。実行時にボタン (btn1) から別のボタン (btn2) へ。ただし、コンパイラはこの割り当てが無効であると判断し、イベント ハンドラは割り当ての左側にのみ割り当てられると述べました。

解決策:

この単純なアプローチではコンパイラ エラーが発生しました。実行時にイベント ハンドラーを盗むことは確かに可能ですが、リフレクションが必要であるという注意点があります。リフレクションにより、通常はアクセスできないオブジェクトのプライベートおよび内部メンバーへのアクセスが許可されます。

実装の詳細:

解決策にはいくつかの手順が含まれます:

  1. 取得シークレット イベント キー: イベント ハンドラーは、「EventClick」という名前のプライベート フィールドを使用して内部的に保存されます。このフィールドに静的にアクセスするには、リフレクションが使用されます。
  2. EventHandlerList の取得: Component クラスの "Events" プロパティには、登録されているすべてのイベント ハンドラーを含む EventHandlerList が格納されます。このプロパティはリフレクション経由でアクセスされます。
  3. ソースからのハンドラーの削除: EventHandlerList を使用すると、イベント ハンドラーをソース コントロール (btn1) から削除できます。
  4. 宛先にハンドラーを追加する: 次に、同じ EventHandlerList を使用してイベント ハンドラーを追加します。

コード例:

次のコードは、イベント窃取手法を示します:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      button1.Click += new EventHandler(button1_Click);
      // Get secret click event key
      FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
      object secret = eventClick.GetValue(null);
      // Retrieve the click event
      PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
      EventHandlerList events = (EventHandlerList)eventsProp.GetValue(button1, null);
      Delegate click = events[secret];
      // Remove it from button1, add it to button2
      events.RemoveHandler(secret, click);
      events = (EventHandlerList)eventsProp.GetValue(button2, null);
      events.AddHandler(secret, click);
    }

    void button1_Click(object sender, EventArgs e) {
      MessageBox.Show("Yada");
    }
  }
}
ログイン後にコピー

警告:

コードが示すように、イベント ハンドラーを盗むプロセスはかなり複雑であり、次のような複雑な知識が必要です。内部オブジェクト構造。 Microsoft がこれらの構造への直接アクセスを防ぐために多大な努力を払ってきたことは明らかであり、この手法は慎重に使用されるべきであることが示唆されています。

以上がC# ではイベント ハンドラーが盗まれて実行時に再割り当てされる可能性がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート