使用SWIG从C ++回调到C#

问题描述 投票:1回答:1

我有一个在C#.Netcore和C ++ Windows应用程序中运行的应用程序。我使用SWIG实现了C#和C ++之间的互操作性。

但是我无法实现从C ++到C#的回调功能。我也尝试通过将函数指针从C#传递到C ++。但这也失败了

我的意图是通过以下方式实现回调

  1. 通过将C#函数指针传递给C ++并在需要时调用该函数指针,以便执行C#函数。

  2. [在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 ++实现回调功能...
c# c++ swig
1个回答
1
投票
如下更改SWIG接口代码后,它对我有用
© www.soinside.com 2019 - 2024. All rights reserved.