를 사용> 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 ". 그것을 가능하게하려면 원래 콜백/lambda/delegate 매개 변수를 call()에 저장 한 다음 자체 처리기 (예 : csharpCallback())를 정의하고 P/Invoke에 피드하도록 CppClass.call() 메서드를 프록시 화해야합니다. 콜백에 해당합니다. 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