2014-11-17 23 views
5

Sto cercando di trovare un modo per aggiungere codice alle funzioni generate da swig. Ho usato typemap per estendere le classi, ma non riesco a trovare nulla nella documentazione sull'estensione di funzioni specifiche.Aggiungere codice alla classe generata automaticamente in SWIG

Dato il seguente file di interfaccia sorso:

%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" 

ricevo il seguente codice C#:

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(...); 

    } 
    ... 
} 

vorrei aggiungere del codice al Processo di funzioni, questo codice è una chiamata a SetDllDirectory(Path) che carica la DLL corretta in base al tipo di piattaforma. Questo deve accadere all'interno della chiamata Process().

Qualsiasi aiuto è molto apprezzato!

+1

Mai usato lo swig (e basato su quello che ho cercato su google) sembra che si voglia iniettare codice specifico C# ('SetDllDirectory()') durante la traduzione dal file sorgente C++ preesistente. Se è giusto, allora penso che devi riorganizzare il codice C++ per adattarlo all'iniezione. ESEMPIO Creazione di una chiamata di una funzione virtuale stub nel codice C++ 'Process()' che è possibile sovrascrivere successivamente una volta che si è nel realm C#. –

+0

possibile duplicato di [È possibile aggiungere codice a un metodo esistente quando si usa Swig per costruire un wrapper C# per il codice C++?] (Http://stackoverflow.com/questions/11286913/is-it-possible-to-add -code-to-an-existing-method-when-using-swig-to-build-ac-sh) – cdiggins

+0

@PeterM Questo è il tipo di approccio che stavo pensando, ma non riuscivo a trovare un modo per farlo funzionare davvero . Flexo ha dato un modo alternativo per iniettare codice C# direttamente da provare. –

risposta

3

È possibile generare il codice che si sta cercando utilizzando %typemap(csout). È un po 'un trucco, e dovrai copiare alcuni dei typemap esistenti per SWIGTYPE (che è un generico segnaposto) che può essere trovato in csharp.swg

Quindi, ad esempio, dato un file di intestazione example.h:

struct SomeObject {}; 

struct MyClass { 
    static SomeObject test(); 
}; 

È quindi possibile scrivere il seguente file di interfaccia SWIG:

%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" 

che produce:

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

Se vuoi generare quello per tutti i tipi di ritorno, non solo le cose che restituiscono SomeObject avrai un po 'più di lavoro da fare per tutte le varianti di csout.

+0

Questo sembra fantastico, grazie. Farò un tentativo e vedrò se riesco a ottenere una versione funzionante insieme. –

-1

Sezione 20.8.7 of the SWIG docs mostra come utilizzare typemap(cscode) per estendere le classi generate.

+1

Ciò consente di aggiungere metodi aggiuntivi, ma non di estendere un metodo esistente. –

+0

Credo di aver visto un post che usa 'cscode' con'% ignore' e '% rinomina', ma non riesco a trovarlo ora ... – Schollii