2009-04-03 61 views
7

Tôi đang gọi phương thức qua interop trả về tham số out IntPtr. Làm cách nào để có được byte* cho số IntPtr để tôi có thể hoạt động trên đó? Tôi đã thử các cách sau:Cách truyền IntPtr sang byte *

fixed(byte* ptr = (byte)myIntPtr) 

nhưng không hoạt động. Bất kỳ trợ giúp sẽ được đánh giá cao!

+1

Xin chào Dmitri, bạn có thể yêu cầu thêm thông tin hoặc chấp nhận câu trả lời không? –

Trả lời

13

Bạn chỉ có thể viết:

byte* ptr = (byte*)int_ptr; 

Bạn không cần phải sử dụng từ khóa cố định. Bạn không muốn ghim IntPtr, phải không?

+0

Điều này cũng hoạt động tốt, mặc dù cá nhân tôi thích phương pháp ToPointer, đặc biệt nếu bạn không cần ngay lập tức chuyển đổi nó thành một con trỏ kiểu cụ thể (ví dụ: từ void * sang byte *). – Noldorin

5

myIntPtr.ToPointer()

+0

Lưu ý rằng từ khóa cố định không thực sự thích hợp trong trường hợp này vì nó được sử dụng để ngăn việc di chuyển các biến. Vì IntPtr đã là một con trỏ (được quản lý), về cơ bản bạn chỉ muốn chuyển đổi trực tiếp giữa hai loại. Xem thêm http://msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx – Noldorin

+2

IntPtr trong trường hợp này là * không * một con trỏ được quản lý, chứ không phải con trỏ không được quản lý! –

+1

Vâng, điều tôi thực sự muốn nói là IntPtr là một con trỏ được quản lý theo nghĩa là nó là một phần của các thư viện được quản lý, trong khi byte * là một con trỏ kiểu C không an toàn. Có lẽ "an toàn" sẽ là một từ tốt hơn, mặc dù điều quan trọng cần lưu ý là sự khác biệt giữa IntPtr và SafeHandle. – Noldorin

1

Nếu bạn không muốn mã không an toàn trong ứng dụng của mình, bạn sẽ phải sử dụng các phương thức trong System.Runtime.InteropServices.Marshal hoặc thậm chí tốt hơn nữa khai báo các kiểu tham số của chức năng interop của bạn.

1

Tôi không muốn "mã không an toàn" trong ứng dụng của mình, vì vậy tôi đã làm như sau để chuyển đổi IntPtr thành byte []. Với IntPtr được gọi là "unsafeDataBlock":

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize); 
1

Điều này có vẻ phù hợp với tôi, tôi không sử dụng Interop nhưng vẫn gọi chức năng C++ được quản lý từ C Sharp. Tuy nhiên, hàm C++ được quản lý được gọi là mã không được quản lý để nó thực hiện tương tự như Interop.

Dù sao, trong C++ hàm được gọi từ c-sắc nét, tôi đã sử dụng mã này:

(anyPointerType *) con trỏ = (anyPointertype *) myIntPtr.ToPointer();

+1

Chỉ cần làm rõ ý tôi là: " Tôi đã không sử dụng Interop nhưng vẫn gọi chức năng C++ được quản lý từ C Sharp. Tuy nhiên, hàm C++ được quản lý được gọi là mã không được quản lý để nó thực hiện tương tự như Interop. " gọi mã unmanged qua Interop: C-Sharp - (Sử dụng Interop gọi)> không được quản lý đang có kết quả tương tự như gọi từ ++ chức năng c-sắc nét một c quản lý mà các cuộc gọi unmanaged code: C-Sharp - (Cuộc gọi)> Chức năng C++ được quản lý - (Cuộc gọi)> mã không được quản lý và quy trình sau thường dễ dàng hơn nhiều –

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