2014-11-17 2 views
5

생성 된 함수에 코드를 추가하는 방법을 찾으려고합니다. 클래스를 확장하기 위해 typemaps를 사용했지만 문서에서 특정 함수를 확장하는 데 필요한 것을 찾을 수 없습니다. 나는 다음과 같은 C# 코드를 얻을 수SWIG에서 자동 생성 된 클래스에 코드 추가

%module Test 
%{ 
#include "example.h" 
%} 

%typemap(cscode) Example %{ 
    bool 64bit = SizeOf(typeof(System.IntPtr)) == 8; 
    static string Path = 64bit ? "/...Path to 64 bit dll.../" : 
           "/...Path to 32 bit dll.../"; 
%} 

%include "example.h" 

: 다음 꿀꺽 꿀꺽 인터페이스 파일을 감안할 때

public class MyClass : global::System.IDisposable { 
    ... 
    bool 64bit = SizeOf(typeof(System.IntPtr)) == 8; 
    static string Path = 64bit ? "/...Path to 64 bit dll.../" : 
           "/...Path to 32 bit dll.../"; 

    ... 
    public static SomeObject Process(...) {  // Function defined in example.h 
               <- I would like to add some code here. 
     SomeObject ret = new SomeObject(...); 

    } 
    ... 
} 

내가 함수 프로세스에 몇 가지 코드를 추가하고 싶습니다,이 코드를 호출입니다 SetDllDirectory(Path)은 플랫폼 유형에 따라 올바른 dll을로드합니다. 이 메시지는 Process() 호출 내에서 발생해야합니다.

도움을 주시면 대단히 감사하겠습니다.

+1

swig (그리고 내가 방금 봤던 것을 기반으로)를 사용하지 않은 것은 기존 C++ 소스 파일에서 변환하는 동안 C# 특정 코드 ('SetDllDirectory()')를 삽입하려는 것으로 보입니다. 그것이 맞다면, 나는 그 주입을 수용하기 위해 C++ 코드를 재정렬해야한다고 생각한다. EG'Process()'C++ 코드에서 스텁 가상 함수 호출을 생성합니다. C++ 코드는 나중에 C# 영역에 있으면 재정의 할 수 있습니다. –

+0

가능한 복제본 [Swig을 사용하여 C++ 코드 용 C# 래퍼를 작성할 때 기존 방법에 코드를 추가 할 수 있습니까?] (http://stackoverflow.com/questions/11286913/is-it-possible-to-add -code-to-an-existing-method-swig-to-build-ac-sh) – cdiggins

+0

@PeterM 그건 내가 생각하고있는 접근 방식이지만 실제로 작동하게하는 방법을 찾지 못했다. . Flexo는 직접 시도 할 C# 코드를 직접 삽입하는 대체 방법을 제공합니다. –

답변

3

%typemap(csout)을 사용하여 찾고있는 코드를 생성 할 수 있습니다. 그것은 약간의 해킹이지만 csharp.swg에서 찾을 수있는 SWIGTYPE (일반적인 자리 표시 자)의 기존 typemap 중 일부를 복사해야합니다.

예를 들어, 주어진 헤더 파일 example.h :

struct SomeObject {}; 

struct MyClass { 
    static SomeObject test(); 
}; 

당신은 다음 꿀꺽 꿀꺽 인터페이스 파일을 작성할 수 있습니다

%module Test 
%{ 
#include "example.h" 
%} 

%typemap(csout,excode=SWIGEXCODE) SomeObject { 
    // Some extra stuff here 
    $&csclassname ret = new $&csclassname($imcall, true);$excode 
    return ret; 
} 

%include "example.h" 

생산 :

public static SomeObject test() { 
    // Some extra stuff here 
    SomeObject ret = new SomeObject(TestPINVOKE.MyClass_test(), true); 
    return ret; 
} 

SomeObject를 반환하는 것뿐만 아니라 모든 반환 유형에 대해 생성하려면 csout의 모든 변형에 대해 수행해야 할 작업이 조금 더 필요합니다.

+0

감사합니다. 나는 그것을 풀어서 함께 작동하는 버전을 얻을 수 있는지 알아볼 것입니다. –

-1

섹션 20.8.7 of the SWIG docstypemap(cscode)을 사용하여 생성 된 클래스를 확장하는 방법을 보여줍니다.

+1

이렇게하면 추가 메서드를 추가 할 수 있지만 기존 메서드는 확장 할 수 없습니다. –

+0

나는'% ignore'와'% rename'과 함께'cscode'를 사용하는 게시물을 보았을 것으로 믿습니다.하지만 지금은 찾을 수 없습니다 ... – Schollii

관련 문제