我有一个在C#.Netcore和C ++ Windows应用程序中运行的应用程序。我使用SWIG实现了C#和C ++之间的互操作性。
但是我无法实现从C ++到C#的回调功能。我也尝试通过将函数指针从C#传递到C ++。但这也失败了
我的意图是通过以下方式实现回调
通过将C#函数指针传递给C ++并在需要时调用该函数指针,以便执行C#函数。
[在C ++中创建具有虚函数的基类,并在C#中派生一个实现虚方法的类。将派生对象设置为C ++,以便我可以调用object-> VirtualMethod来调用C#函数。
但是两种方法都失败。
'''C ++代码
#pragma once
#include <string>
#include "TestDataClass.h"
using namespace std;
class EventHandlerBase
{
public:
virtual void handle() = 0;
};
class TestClass
{
public:
TestClass();
~TestClass();
TestDataClass oData;
TestDataClass* pData;
int times2(int arg, string data);
void SetData(TestDataClass data);
void SetPointerData(TestDataClass* data);
TestDataClass* GetPointerData();
TestDataClass GetData();
void Print();
EventHandlerBase* EventObject;
void SetEventObj(EventHandlerBase* data);
};
'''
'''C ++实现
#include "TestClass.h"
#include <iostream>
TestClass::TestClass()
{
}
TestClass::~TestClass()
{
}
int TestClass::times2(int arg, string data)
{
return arg * 2;
}
void TestClass::SetData(TestDataClass data)
{
this->oData = data;
}
void TestClass::SetPointerData(TestDataClass* data)
{
this->pData = data;
}
void TestClass::Print()
{
cout << this->oData.iData << endl;
cout << this->oData.sData << endl;
cout << this->pData->iData << endl;
cout << this->pData->sData << endl;
this->EventObject->handle();
}
TestDataClass* TestClass::GetPointerData()
{
return this->pData;
}
TestDataClass TestClass::GetData()
{
return this->oData;
}
void TestClass::SetEventObj(EventHandlerBase* data)
{
if (data)
{
this->EventObject = data;
}
else
{
cout << "Event object is null" << endl;
}
}
'''
'''接口代码] >>
%module CppTestApp %include <windows.i> %include <std_string.i> // generate directors for all classes that have virtual methods %feature("director") EventHandlerBase; %{ #include "TestClass.h" #include "TestDataClass.h" %} %include "TestClass.h" %include "TestDataClass.h"
'''
'''C#代码
class MyEventHandler : EventHandlerBase { public MyEventHandler() : base(System.IntPtr.Zero, false) { } public override void handle() { System.Console.WriteLine("handling event..."); } } static void Main(string[] args) { TestClass cpp_File = new TestClass(); MyEventHandler myEvent = new MyEventHandler(); TestDataClass data = new TestDataClass() { iData = 10, sData = "Hello I am Object" }; TestDataClass pData = new TestDataClass() { iData = 25, sData = "Hello I am Pointer" }; Console.WriteLine(cpp_File.times2(1, "Haii").ToString()); cpp_File.SetData(data); cpp_File.SetPointerData(pData); Console.WriteLine($"{cpp_File.GetData().iData} , {cpp_File.GetData().sData}"); Console.WriteLine($"{cpp_File.GetPointerData().iData} , {cpp_File.GetPointerData().sData}"); cpp_File.SetEventObj(myEvent); cpp_File.Print(); Console.WriteLine("-----------------------------"); Console.ReadLine(); }
'''
当我执行cpp_File.SetEventObj(myEvent);]时>> Cpp的对象设置为null。因此,我无法调用虚函数。
您能帮我吗?
此外,如果这不是正确的方法,那么请建议使用某种方法实现从C ++到c#的回调(使用SWIG)
或任何其他方法<<< [将函数指针从C#设置为C ++(使用SWIG)。以便我可以将函数指针从C#设置为C ++,并通过调用该函数指针实现对C#的回调我有一个在C#.Netcore和C ++ Windows应用程序中运行的应用程序。我使用SWIG实现了C#和C ++之间的互操作性。但是我无法从C ++实现回调功能...