類包裝,說我有下面的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專家都可以建議一個用於生成這種鉤子包裝的優雅解決方案嗎?
從本質上講,遵循這些指令可以使C到C#回調在Intel Parallel Studio XE 2017和Visual Studio 2017下都能夠完美工作。另請參見http://swig.10945.n7.nabble.com/C-Callback-Function-Implementation -td10853.html。 – Contango