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

답변

0

먼저 순수 C#으로 래퍼를 구현하는 방법을 결정해야합니다. 그런 다음 SWIG 2.0 문서의 19.8.7 Extending proxy classes with additional C# code 섹션을보십시오. 클래스가 아닌 대리자를 래핑하기 때문에 약간 까다로울 수 있습니다. 얼마나 멀리 있는지 확인하고 질문을 업데이트하거나 답변을 게시하십시오!