2014-04-17 24 views
1

類包裝,說我有下面的C++代碼:代理功能C# - > C++使用痛飲

/* File : example.h*/ 
typedef void (__stdcall *CppCallback)(int code, const char* message); 

class CppClass 
{ 
public: 
    CppClass() {}; 
    void call(CppCallback callback) 
    { 
     callback(1234, "Hello from C++"); 
    } 
}; 

然後,我有C#對應:

/* File : example.cs */ 
using System; 
using System.Text; 

public delegate void CSharpCallback(int code, string param); 

public class App 
{ 
    static void Main() 
    { 
     CppClass cppClass = new CppClass(); 

     cppClass.call((i, s) => { 
       Console.WriteLine("Code " + i + " and message '" + s + "'"); 
      }); 
    } 
} 

然後,我有痛飲.i文件粘合他們一起:

/* File : example.i */ 
%module example 

%include <windows.i> 
%include <stl.i> 

%{ 
#include "example.h" 
%} 

%define %cs_callback(TYPE, CSTYPE) 
    %typemap(ctype) TYPE, TYPE& "void *" 
    %typemap(in) TYPE %{ $1 = ($1_type)$input; %} 
    %typemap(in) TYPE& %{ $1 = ($1_type)&$input; %} 
    %typemap(imtype, out="IntPtr") TYPE, TYPE& "CSTYPE" 
    %typemap(cstype, out="IntPtr") TYPE, TYPE& "CSTYPE" 
    %typemap(csin) TYPE, TYPE& "$csinput" 
%enddef 

%cs_callback(CppCallback, CSharpCallback) 

%include "example.h" 

現在,我想以這樣的方式被執行C#拉姆達之前會做一些,像打印「何代理回調() oked」。爲了使它成爲可能,我還需要代理CppClass.call()方法,以便將原始回調/ lambda /委託參數保存爲call(),然後定義自己的處理程序(例如csharpCallback())並將其提供給P/Invoke對應於回調。當C++應用程序調用callback()時,它將在我的C#csharpCallback()中結束,然後它將打印「Hooked」並調用C#cppClass.callback()中提供的原始保存的回調函數。

這個問題 - 任何SWIG專家都可以建議一個用於生成這種鉤子包裝的優雅解決方案嗎?

+0

從本質上講,遵循這些指令可以使C到C#回調在Intel Parallel Studio XE 2017和Visual Studio 2017下都能夠完美工作。另請參見http://swig.10945.n7.nabble.com/C-Callback-Function-Implementation -td10853.html。 – Contango

回答