2009-09-14 16 views
7

Trong một nỗ lực để tìm hiểu để sử dụng PInvoke trong C#, tôi là một chút không chắc chắn làm thế nào để xử lý các trường hợp khác nhau với con trỏ liên quan đến các loại giá trị đơn giản.Làm thế nào để P/Gọi khi con trỏ được tham gia

tôi nhập khẩu hai chức năng sau đây từ một DLL không quản:

public int USB4_Initialize(short* device); 
public int USB4_GetCount(short device, short encoder, unsigned long* value); 

Chức năng đầu tiên sử dụng con trỏ như một đầu vào, thứ hai như một đầu ra. sử dụng của họ là khá đơn giản trong C++:

// Pointer as an input 
short device = 0; // Always using device 0. 
USB4_Initialize(&device); 

// Pointer as an output 
unsigned long count; 
USB4_GetCount(0,0,&count); // count is output 

nỗ lực đầu tiên của tôi trong C kết quả # trong P sau/Gọi ra:

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(IntPtr deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, IntPtr value); //ulong* 

Làm thế nào để sử dụng các chức năng này trong C# trong cùng một cách như Mã C++ ở trên? Có cách nào tốt hơn để khai báo các loại này, có thể sử dụng MarshalAs?

+0

Hey, USB 4 chưa? Tôi vẫn đang chờ đợi 3,0 –

+1

Tôi ước. Nó không có gì để làm với USB4. Đây chỉ là một thiết bị USB công ty có để kết nối với một bộ mã hóa, và vì nó là phiên bản thứ 4 của sản phẩm của họ, họ ngu ngốc đặt tên cho sản phẩm USB4. –

Trả lời

12

Nếu con trỏ là một loại nguyên thủy duy nhất và không phải là một mảng, sử dụng ref/out để mô tả các tham số

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref uint32 value) 

Trong những ví dụ ra có lẽ là thích hợp hơn nhưng một trong hai sẽ làm việc.

+0

Vì vậy, trong GetCount() tôi có thể sử dụng thay vì ref? –

+0

Tôi hiểu, đây chính là điều tôi mong đợi. Cảm ơn. –

+0

Yep sẽ nói điều tương tự ngoại trừ việc có định nghĩa USB4_GetCount – zebrabox

0

Thời gian chạy .NET có thể thực hiện rất nhiều chuyển đổi đó (được gọi là "marshaling") cho bạn. Mặc dù IntPtr rõ ràng sẽ luôn thực hiện chính xác những gì bạn nói, nhưng bạn có thể thay thế từ khóa ref cho một con trỏ như thế.

[DllImport("USB4.dll")] 
public static extern int USB4_Initialize(ref short deviceCount); //short* 

[DllImport("USB4.dll")] 
public static extern int USB4_GetCount(short deviceNumber, short encoder, ref short value); //ulong* 

Sau đó, bạn có thể gọi họ là như thế này:

short count = 0; 

USB4_Initialize(ref count); 

// use the count variable now.