簡體   English   中英

使用 SWIG 從 C++ 回調到 C#

[英]Callback from C++ to C# using SWIG

我有一個在 C#.Netcore 和 C++ windows 應用程序中運行的應用程序。
我使用 SWIG 實現了 C# 和 C++ 之間的互操作性。

但是我無法實現從 C++ 到 C# 的回調功能。 我也嘗試通過將函數指針從 C# 傳遞給 C++。 但它也失敗了

我的意圖是通過以下方式實現回調

  1. 通過將 C# 函數指針傳遞給 C++ 並在需要時調用該函數指針,以便執行 C# 函數。

  2. 在 C++ 中創建一個帶有虛函數的基類,並在 C# 中派生一個實現虛方法的類。 將派生對象設置為 C++,以便我可以調用對象->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 的對象設置為空。 所以我無法調用虛函數。

你能幫我嗎?

此外,如果這不是正確的方法,那么請建議一些方法來實現從 C++ 到 c# 的回調(使用 SWIG)或任何其他方法將函數指針從 C# 設置為 C++(使用 SWIG)

這樣我就可以設置一個從 C# 到 C++ 的函數指針,並通過調用該函數指針來實現對 C# 的回調

我得到了上述查詢的答案,並將其發布在這里。 你也可以參考這個鏈接

如下更改 SWIG 接口代碼后,它對我有用

'''接口代碼

%module (directors="1") CppTestApp


%{
    #include "TestClass.h"

    #include "TestDataClass.h"
%}


 %include <windows.i>
 %include <std_string.i>

%feature("director") EventHandlerBase;

%include "TestClass.h"
%include "TestDataClass.h"

'''

''' C# 代碼

class MyEventHandler : EventHandlerBase
    {

        public override void handle()
        {
            System.Console.WriteLine("handling event...");
        }
    }

'''

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM