Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/CLI/C#在接口中使用虚拟方法进行回调 我试图编写一个C++应用程序,它使用一些旧C++代码,它提供需要重写的抽象类来接收OnCallbacks。C++中的方法是从基类派生的开发人员,如果想要接收回调,则重写一些方法,非常正常。_C#_C++_Interface_Callback_C++ Cli - Fatal编程技术网

C++/CLI/C#在接口中使用虚拟方法进行回调 我试图编写一个C++应用程序,它使用一些旧C++代码,它提供需要重写的抽象类来接收OnCallbacks。C++中的方法是从基类派生的开发人员,如果想要接收回调,则重写一些方法,非常正常。

C++/CLI/C#在接口中使用虚拟方法进行回调 我试图编写一个C++应用程序,它使用一些旧C++代码,它提供需要重写的抽象类来接收OnCallbacks。C++中的方法是从基类派生的开发人员,如果想要接收回调,则重写一些方法,非常正常。,c#,c++,interface,callback,c++-cli,C#,C++,Interface,Callback,C++ Cli,问题是,我需要能够在C#中访问这些数据,所以我编写了一个C++/CLI桥DLL,希望能够实现这一点,但没有效果。我简化了我的设计,希望你明白我的意思 C++代码(希望我不需要做太多修改) 最后,我打算在C#端,在实现接口的类中使用它 // C# code namespace ApiWrapperNet { public class DataListenerImpl : IDataListener { public void OnMessage(string m

问题是,我需要能够在C#中访问这些数据,所以我编写了一个C++/CLI桥DLL,希望能够实现这一点,但没有效果。我简化了我的设计,希望你明白我的意思

C++代码(希望我不需要做太多修改)

最后,我打算在C#端,在实现接口的类中使用它

// C# code
namespace ApiWrapperNet 
{
    public class DataListenerImpl : IDataListener
    {
        public void OnMessage(string message)
        {
            Console.WriteLine(message);     // should display Hello World
        }

        public DataListenerImpl()
        {
            var m = new DataWrapperDotNet();

            m.Subscribe("Product_Name", this);
        }
    }   
}

必须编写DataListener的非托管版本(普通类,无引用)。使用
gcroot
存储对托管包装的引用。在Subscribe()方法中创建并初始化该类的实例,准备作为第二个参数传递。将IDataListener^存储在字段中以供以后使用。在其OnMessage()实现中,使用gcroot调用DataWrapperDotNet中的托管方法。然后可以通过存储的IDataListener^.=(不幸的是,我还是C++/CLI新手,我不知道这一切意味着什么。有人能提供一个示例或解决方案吗?…谢谢。
// C++/CLI [glue code]
namespace ApiWrapperNet 
{
    public interface class IDataListener {
    public:
        virtual void OnMessage(System::String^ message) = 0;
    };

    public ref class DataWrapperDotNet {
    public:

        void Subscribe(System::String^ prod, IDataListener^ ptr)
        {
            // how to implement here ?!?
            // i want to call DataWrapper::Subscribe(prod, ptr);
            // by passing in the reference to my object so callback can be made
        };
    };
}
// C# code
namespace ApiWrapperNet 
{
    public class DataListenerImpl : IDataListener
    {
        public void OnMessage(string message)
        {
            Console.WriteLine(message);     // should display Hello World
        }

        public DataListenerImpl()
        {
            var m = new DataWrapperDotNet();

            m.Subscribe("Product_Name", this);
        }
    }   
}