2014-11-17 19 views
5

Tôi đang cố gắng tìm cách thêm mã để tạo các hàm được tạo. Tôi đã sử dụng các kiểu chữ để mở rộng các lớp, nhưng không thể tìm thấy bất kỳ thứ gì trong tài liệu về việc mở rộng các hàm cụ thể.Thêm mã vào lớp được tạo tự động trong SWIG

Với giao diện uống một lân tập tin sau đây:

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

tôi nhận được đoạn mã sau 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(...); 

    } 
    ... 
} 

Tôi muốn thêm một số mã để quá trình chức năng, mã này là một lời kêu gọi SetDllDirectory(Path) tải dll chính xác tùy thuộc vào loại nền tảng. Điều này cần xảy ra bên trong cuộc gọi Process().

Bất kỳ trợ giúp nào được đánh giá cao!

+1

Không bao giờ sử dụng swig (và dựa trên những gì tôi vừa googled) có vẻ như bạn muốn tiêm mã C# cụ thể ('SetDllDirectory()') trong khi dịch từ tệp nguồn C++ từ trước. Nếu đó là đúng, sau đó tôi nghĩ rằng bạn phải sắp xếp lại mã C + + của bạn để phù hợp với tiêm đó. Tạo một hàm stub virtual function trong 'Process()' C++ code mà sau này bạn có thể ghi đè khi bạn đang ở trong C# cõi. –

+0

có thể trùng lặp của [Có thể thêm mã vào một phương thức hiện có khi sử dụng Swig để xây dựng trình bao bọc C# cho mã C++ không?] (Http://stackoverflow.com/questions/11286913/is-it-possible-to-add -code-to-an-existing-method-khi-sử dụng-swig-to-build-ac-sh) – cdiggins

+0

@PeterM Đó là kiểu tiếp cận mà tôi đã nghĩ đến, nhưng không thể tìm ra cách để thực sự làm cho nó hoạt động . Flexo đã đưa ra một cách khác để chèn mã C# trực tiếp mà tôi sẽ thử. –

Trả lời

3

Bạn có thể tạo mã bạn đang tìm kiếm bằng cách sử dụng %typemap(csout). Đó là một chút của một hack mặc dù, và bạn sẽ cần phải sao chép một số các typemap hiện có cho SWIGTYPE (mà là một nơi giữ chung) có thể được tìm thấy trong csharp.swg

Vì vậy, ví dụ, cho một tập tin tiêu đề example.h:

struct SomeObject {}; 

struct MyClass { 
    static SomeObject test(); 
}; 

sau đó bạn có thể ghi các file giao diện SWIG sau:

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

nào sản xuất:

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

Nếu bạn muốn tạo điều đó cho tất cả các loại trả về, không chỉ những thứ trả về SomeObject bạn sẽ có nhiều công việc hơn để làm cho tất cả các biến thể của csout.

+0

Điều này có vẻ tuyệt vời, cảm ơn. Tôi sẽ cung cấp cho nó một đi và xem nếu tôi có thể có được một phiên bản làm việc với nhau. –

-1

Mục 20.8.7 of the SWIG docs cho biết cách sử dụng typemap(cscode) để mở rộng các lớp được tạo.

+1

Điều đó cho phép bạn thêm các phương thức bổ sung, nhưng không mở rộng một phương thức hiện có. –

+0

Tôi tin rằng tôi thấy một bài viết sử dụng 'cscode' với'% ignore' và '% rename' nhưng tôi không thể tìm thấy nó bây giờ ... – Schollii

Các vấn đề liên quan