托管C ++中的等效代码& C#(VB6中的事件)

时间:2009-08-28 06:15:40

标签: c# c++ events managed

在VB6中,在ActiveX组件中创建的事件如下所示:

公共事件处理完成()

并调用ActiveX组件,如:

RaiseEvent ProcessingComplete

我正在创建一个托管C ++ DLL,我想做同样的事情。它看起来不像代表正是我想要的。我认为更合适的项目是__event声明。帮助?!?

最后,我有一个C#应用程序,我希望有这样的函数:

MyObject :: ProcessingComplete()< ---当发生“RaiseEvent”时,这是被调用的函数。 {

}

感谢。

3 个答案:

答案 0 :(得分:1)

听起来好像你想要一个活动。在.NET中,事件只是一个委托,按惯例,它具有特殊签名。这是在类中声明事件的C#示例:

public class MyObject
{
    // ...

    public event EventHandler ProcessingComplete;

    // ...
}

EventHandler是一个具有两个参数的委托:

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);
    }
}

答案 1 :(得分:0)

活动和代表。

Events and Delegates

  

摘要:委托是一个类   可以保存对方法的引用。   与其他类不同,是委托类   有签名,它可以容纳   仅引用匹配的方法   它的签名。

Events in Managed C++: Problem with Events, WindowEvents

Managed Extensions: Using Delegates and Events

  

总结:.NET编程包括   代表和事件的概念   促进观察员或   发布/订阅设计模式。最   次,你使用大致相同的事件   回调函数的方式   已在标准Win32中使用多年   API或MFC编程。

答案 2 :(得分: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应该有相同的签名......