非管理クラスのSystem :: windows :: Forms :: TimerにTickイベントを追加する方法

私はいくつかの例で見つけたようにそれをしようとしています:

TimerID = gcnew System::Windows::Forms::Timer(); 
TimerID->Tick += gcnew System::EventHandler(this, &Bridge::timer1_Tick);

そして

System::Void Bridge::timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
{
    Bridge::DoUpdate();
}

しかし、エラーのためにイベントハンドラを作成することはできません:

エラーC3364: 'System :: EventHandler':デリゲートの引数が無効です   コンストラクタ;デリゲートターゲットはメンバーへのポインタである必要があります   関数

ブリッジはアンマネージドクラスです。 だから私はこのようにTimerIDを宣言している:

gcroot TimerID;

私はここで間違って何をしていますか? Tickイベントを追加するには?

1
なぜあなたはこれをやりますか?管理タイマーを使用している場合は、管理タイプを使用してください。
追加された 著者 ildjarn,

1 答え

エラーを診断するのに十分なコードを投稿していません。コンパイル:

public ref class Bridge : public System::Windows::Forms::Form
{
    Timer^ TimerID;
public:
    Bridge(void) {
        InitializeComponent();
        TimerID = gcnew System::Windows::Forms::Timer(); 
        TimerID->Tick += gcnew System::EventHandler(this, &Bridge::timer1_Tick);        
    }
private:
    void Bridge::timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
    }
    void InitializeComponent(void) {
       //etc...
    }
};
1
追加された
ブリッジはアンマネージクラスで、私はTimerにgcrootを使用しています
追加された 著者 Cynede,
あなたは私のSystem :: Void Bridge :: timer1_Tick(System :: Object ^ sender、System :: EventArgs ^ e)もアンマネージドであり、呼び出されないことを意味しますか?私はそれをgcrootにする必要がありますか?
追加された 著者 Cynede,
まあ、それはそれを説明します。管理対象オブジェクトを取得するネイティブメソッドをコンパイルする方法はちょっと不思議です。ネイティブ関数を対象とするデリゲートオブジェクトを取得するには、Marshal :: GetDelegateForFunctionPointer()を使用する必要があります。ターゲット関数は静的でなければならず、クラスのインスタンスメソッドとすることはできません。または、ネイティブメソッドを呼び出すマネージメソッドを呼び出すようにタイマーを設定するだけです。
追加された 著者 Hans Passant,