1

VB6では、ActiveXコンポーネントで作成されたイベントは次のように記述されていました。

パブリックイベントProcessingComplete()

次のようなActiveXコンポーネントで呼び出されます。

RaiseEvent ProcessingComplete

同じことをしたいマネージC++DLLを作成しています。デリゲートがまさに私が望んでいるものではないようです。より適切な項目は__event宣言だと思います。ヘルプ?!?

最後に、次のような関数が必要なC#アプリケーションがあります。

MyObject :: ProcessingComplete()<---これは、「RaiseEvent」が発生したときに呼び出される関数です。{{

}

ありがとう。

4

3 に答える 3

1

それはあなたがイベントを望んでいるように聞こえます。.NETでは、イベントは単なるデリゲートであり、慣例により特別な署名があります。クラスでイベントを宣言するC#の例を次に示します。

public class MyObject
{
    // ...

    public event EventHandler ProcessingComplete;

    // ...
}

EventHandlerは、次の2つのパラメーターを持つデリゲートです。

public delegate EventHandler(object sender, EventArgs e);

送信者はイベントを発生させたオブジェクトであり、EventArgsはイベントサブスクライバーに渡したい情報をエンコードします。

すべてのイベントは、この規則に従うことが期待されています。イベントに特化した情報を伝達したい場合は、EventArgsから派生した独自のクラスを作成できます。.NETは、この目的のために一般的に型指定されたEventHandlerデリゲートを定義しますEventHandler<TEventArgs>。C#の例:

class ProcessingCompleteEventArgs : EventArgs
{
    public ProcessingCompleteEventArgs(int itemsProcessed)
    {
        this.ItemsProcessed = itemsProcessed;
    }

    public int ItemsProcessed
    {
        get;
        private set;
    }
}

// ...

// event declaration would look like this:
public event EventHandler<ProcessingCompleteEventArgs> ProcessingComplete;

イベントをサブスクライブするには、+=演算子を使用します。登録を解除するには、-=演算子を使用します。

void Start()
{
    this.o = new MyObject();
    this.o.ProcessingComplete += new EventHandler(this.OnProcessingComplete);

    // ...
}

void Stop()
{
    this.o.ProcessingComplete -= new EventHandler(this.OnProcessingComplete);
}

void OnProcessingComplete(object sender, EventArgs e)
{
    // ...
}

クラス内でイベントを発生させるには、通常の構文を使用してデリゲートを呼び出すことができます。

void Process()
{
    // ...

    // processing is done, get ready to fire the event
    EventHandler processingComplete = this.ProcessingComplete;

    // an event with no subscribers is null, so always check!
    if (processingComplete != null)
    {
        processingComplete(this, EventArgs.Empty);
    }
}
于 2009-08-28T06:30:00.687 に答える
0

イベントとデリゲート。

イベントと代表者

概要:デリゲートは、メソッドへの参照を保持できるクラスです。他のクラスとは異なり、デリゲートクラスには署名があり、その署名に一致するメソッドへの参照のみを保持できます。

Managed C ++のイベント:イベント、WindowEventsの問題

管理された拡張機能:デリゲートとイベントの使用

概要:.NETプログラミングには、オブザーバーまたはパブリッシュ/サブスクライブのデザインパターンを容易にするためのデリゲートとイベントの概念が含まれています。ほとんどの場合、コールバック関数が標準のWin32APIまたはMFCプログラミングで何年も使用されてきたのとほぼ同じ方法でイベントを使用します。

于 2009-08-28T06:25:07.577 に答える
0

私は代表者が行く方法だと思います。

public delegate void ProcessCompleteEventHandler(object sender, EventArgs e);

クラス外のどこかで上記を定義します。クラスの中

class MySampleClass{
    public event ProcessCompleteEventHandler ProcessComplete;

    void SomeWork()
    {
        //Do some work, and when its over...
        ProcessComplete.Invoke(this, null);
    }

}

メインプログラムの内部:

MySampleClass obj = new MySampleClass();
obj.ProcessComplete += new ProcessCompleteEventHandler(my_handler);

my_handlerは同じ署名を持つ必要があります...

于 2009-08-28T06:26:41.380 に答える