C++/CLI/C#在接口中使用虚拟方法进行回调 我试图编写一个C++应用程序,它使用一些旧C++代码,它提供需要重写的抽象类来接收OnCallbacks。C++中的方法是从基类派生的开发人员,如果想要接收回调,则重写一些方法,非常正常。
问题是,我需要能够在C#中访问这些数据,所以我编写了一个C++/CLI桥DLL,希望能够实现这一点,但没有效果。我简化了我的设计,希望你明白我的意思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#端,在实现接口的类中使用它// 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);
}
}
}