从 C++/CLI 注册到 C# 事件



我正在编写调用 C# 代码C++代码。C# 可能需要在C++代码中调用方法。如果两个部分都是 C#,我想我会使用以下机制。请注意,我将 EventHandler 从 ShouldBCpp 传递到 Csharp 而不是在 ShouldBCpp 中注册,因为ShouldBCpp不知道csharp指向什么(并且无法更改CsharpBase)。

public abstract class CsharpBase
{
    public abstract void SomeMethodDoingActionInB();
}
public class Csharp : CsharpBase
{
    public Csharp(EventHandler f)
    {
        MySpecialHook += f;
    }
    public event EventHandler MySpecialHook;
    public override void SomeMethodDoingActionInB()
    {
        if (MySpecialHook != null)
            MySpecialHook(this, null);
    } 
}
public class ShouldBCpp
{
    public CsharpBase csharp;
    public ShouldBCpp()
    {
        csharp = new Csharp(NotificationFromClassB); // actually using Activator::CreateInstance
    }
    public void NotificationFromClassB(object sender, EventArgs e)
    {
    }
    public void Go()
    {
       csharp.SomeMethodDoingActionInB();
    }
}
class Program
{
    static void Main(string[] args)
    {
        ShouldBCpp shouldBCpp = new ShouldBCpp();
        shouldBCpp.Go();
    }
}

问题是如何在 C++/CLI 中编写 ShouldBCpp。使用delegate :)的奖励积分

谢谢

对 C++/CLI 的简单转换如下所示:

public ref class IsCppCLI
{
public:
    CsharpBase^ csharp;
    IsCppCLI()
    {
        csharp = gcnew Csharp(gcnew EventHandler(this, &IsCppCLI::NotificationFromClassB));
        // You didn't show your Activator code, 
        // but I believe it would translate to C++/CLI as this:
        csharp = dynamic_cast<CsharpBase^>(
            Activator::CreateInstance(
                Csharp::typeid, 
                gcnew array<Object^> {
                    gcnew EventHandler(this, &IsCppCLI::NotificationFromClassB)}));
    }
    void NotificationFromClassB(Object^ sender, EventArgs^ e)
    {
    }
    void Go()
    {
       csharp->SomeMethodDoingActionInB();
    }
}

最新更新