2010-02-10 31 views
7

Chúc mừng.Có thể lấy IntPtr từ một mảng int []?

Trong C#: Nếu tôi có một int [] mảng được khai báo như thế này

int[] array = new array[size]; 

có một cách để có được những IntPtr từ mảng này?

Vấn đề là tôi đang sử dụng khung công tác EmguCV, và có một hàm tạo để tạo một hình ảnh lấy IntPtr tới dữ liệu pixel, để xây dựng một hình ảnh từ một mảng (int []).

Image<Gray,Int32> result = new Image<Gray,int>(bitmap.Width,bitmap.Height,stride,"**array.toPointer??**"); 

Nhân tiện nếu ai đó có thể cho tôi biết cách tính bước tiến, điều đó thật tuyệt.

+0

là C# này? C++? – Pod

+0

C# .Xin lỗi, tôi quên đề cập đến –

Trả lời

13

Bạn sẽ có thể làm điều này mà không cần mã không an toàn sử dụng GCHandle. Đây là mẫu:

GCHandle handle = GCHandle.Alloc(array, GCHandleType.Pinned); 
try 
{ 
    IntPtr pointer = handle.AddrOfPinnedObject(); 
} 
finally 
{ 
    if (handle.IsAllocated) 
    { 
     handle.Free(); 
    } 
} 
+0

Bất kỳ cách nào để đi theo cách khác mà không sao chép dữ liệu? – jjxtra

+0

Thao tác này không sao chép dữ liệu. Nó nói với GC rằng bạn muốn một con trỏ đến một đối tượng được quản lý và không di chuyển nó trên tôi (như khi một bộ sưu tập xảy ra). – Bryan

+0

Ý tôi là có thể tạo một mảng được quản lý mà không cần sao chép dữ liệu không được quản lý – jjxtra

6

Sử dụng mã không an toàn, như thế này:

unsafe 
{ 
    fixed (int* pArray = array) 
    { 
    IntPtr intPtr = new IntPtr((void *) pArray); 
    } 
} 
+9

Và tất nhiên lưu ý rằng intPtr chỉ trỏ đến mảng * trong khi điều khiển nằm trong khối cố định *. Một khi bạn rời khỏi khối cố định, bộ thu gom rác sẽ tự do di chuyển pArray xung quanh trong bộ nhớ một lần nữa và vì thế intPtr có thể trỏ đến rác. –

+0

Vâng, điều tốt này 'intPtr' chỉ hiển thị bên trong khối cố định. –