2011-07-06 36 views
6

(hoàn thành bản sao của http://old.nabble.com/C%2B%2B-pointer-to-method-as-parameter-to-C--td17645155.html, nhưng không thể làm cho công việc vĩ mô đề xuất)Các đại biểu trong SWIG - C#

Tôi đã có C++ hàm sau (giản thể):

InputPort addInputPort(void(*callback)(InputPort)); 

Vấn đề: các chữ ký của người tạo ra chức năng C# là:

public InputPort addInputPort(SWIGTYPE_p_f__InputPort____void callback) 

SWIGTYPE_p_f__InputPort____void không phải là một đại biểu (và không có constructor nào anyway), vì vậy tôi không thể sử dụng addInputPort.

Làm cách nào để yêu cầu SWIG sử dụng đại biểu thay thế? Nếu giải pháp liên quan đến% typemap, , vui lòng kiên nhẫn hơn với tôi ...

+1

Tôi đoán C++/CLI không phải là một tùy chọn? –

+0

Tôi phải điều tra thêm, nhưng tôi sợ nó không phải là: phần lớn phần mềm trung gian được biên dịch trước! – Calvin1602

+0

Cùng một vấn đề. Ban đầu tôi đã sử dụng PInvoke (Chi tiết trong câu hỏi http://stackoverflow.com/questions/11909484/how-to-use-c-sharp-backgroundworker-to-report-progress-in-native-c-code). Bây giờ tôi đang cố gắng sử dụng SWIG, nhưng mã trở nên rất cồng kềnh ... và tôi cũng không thể nhận ra làm thế nào để làm việc với các đại biểu. – sergtk

Trả lời

1

Giải pháp bao gồm% typemap. Hiệu ứng bạn đang thấy là ánh xạ vô dụng mặc định cho các loại không xác định. Trong trường hợp của bạn, loại không xác định là loại hàm void *(InputPort).

Thực tế, tất cả bản dịch của SWIG dựa trên% typemaps đã được viết và tồn tại trong thư viện SWIG chuẩn. Bạn có thể điều tra% typemaps ban đầu cho C# trong số Subversion location này.

Cụ thể, hãy tìm kiếm SWIGStringHelper trong csharphead.swg. Mã đó ánh xạ một đại biểu đến một cuộc gọi lại C. Bí quyết là thêm một thực hiện gọi lại helper trong mô-đun SWIG.

+0

Cảm ơn bạn đã liên kết. Đã một năm rồi tôi thậm chí không còn dự án này nữa. Nhưng tôi đã viết một vài bản đồ ngay bây giờ. Tôi sẽ thử và có một cái nhìn khác về điều này. – Calvin1602

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