2009-03-23 36 views
8

Tất cả các ví dụ tôi có thể tìm thấy bằng cách sử dụng DLLImport để gọi mã C++ từ C# chuyển ints qua lại. Tôi có thể nhận được những ví dụ này làm việc tốt. Phương thức tôi cần gọi có hai cấu trúc như các tham số nhập của nó và tôi không rõ ràng cách tôi có thể thực hiện công việc này.Làm thế nào để sử dụng DLLImport với cấu trúc như các tham số trong C#?

Đây là những gì tôi phải làm việc với:

Tôi sở hữu ++ mã C, vì vậy tôi có thể thực hiện bất kỳ thay đổi/bổ sung vào nó mà tôi cần.

Ứng dụng của bên thứ ba sẽ tải DLL của tôi khi khởi động và dự kiến ​​DLLExport được xác định theo một cách nhất định, vì vậy tôi không thể thay đổi chữ ký phương thức được xuất.

Ứng dụng C# tôi đang xây dựng sẽ được sử dụng làm trình bao bọc để tôi có thể tích hợp phần C++ này vào một số ứng dụng khác của chúng tôi, tất cả được viết bằng C#.

C++ phương pháp chữ ký tôi cần phải gọi trông như thế này

DllExport int Calculate (const MathInputStuctType *input, 
    MathOutputStructType *output, void **formulaStorage) 

Và MathInputStructType được định nghĩa như sau

typedef struct MathInputStuctTypeS { 
    int    _setData; 
    double    _data[(int) FieldSize]; 
    int    _setTdData; 
} MathInputStuctType; 

Trả lời

4

Từ tuyên bố bạn được đăng, mã # C của bạn sẽ giống như thế này :

[DllImport("mydll.dll")] 
static extern int Calculate(ref MathInputStructType input, 
    ref MathOutputStructType output, ref IntPtr formulaStorage); 

Tùy thuộc vào cấu trúc của MathInputStructTyp e và MathOutputStructType trong C++, bạn sẽ phải thuộc tính các khai báo cấu trúc đó để chúng sắp xếp chính xác.

+0

Thiếu tên hàm btw :) – leppie

+0

"bạn sẽ phải phân bổ các khai báo cấu trúc đó để chúng sắp xếp chính xác." Phải, đây là phần mà tôi không thực sự hiểu. Tôi đã thêm cấu trúc vào câu hỏi của mình. –

3

Đối với struct:

struct MathInputStuctType 
{ 
    int  _setData; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = FieldSize)] 
    double[] _data; 
    int  _setTdData; 
} 
+0

Tôi không chắc chắn nếu nó là 100% cần thiết nhưng bạn nên đặt ArraySubType thành UnmanagedType.R8 cho trường _data. – JaredPar

+0

Điều đó nên được phỏng đoán (tôi cho rằng, như marshaller là khá tốt). – leppie

2

Bạn có thể muốn nhìn vào dự án này trên CodePlex, http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120. Nó sẽ giúp bạn sắp xếp chính xác cấu trúc.

+0

Điều này có vẻ mát mẻ và tất cả, nhưng không có vấn đề gì DLL tôi chọn, nó giữ nói với tôi rằng hy vọng một biểu hiện. Trông giống như một công cụ tuyệt vời nếu nó hoạt động. –

+0

Không biết đó là hạn chế, xin lỗi về điều đó. – LanceSc

+0

Đừng lo lắng, cảm ơn vì sự giúp đỡ. –

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