2010-02-10 6 views
7

인사말. C#에서 int [] 배열에서 IntPtr을 가져올 수 있습니까?

: 나는이있는 경우의 int [] 배열이 배열에서을 IntPtr를 얻을 수있는 방법이이

int[] array = new array[size]; 

같은 선언?

내가 EmguCV 프레임 워크를 사용하고 있으며 배열 (int [])에서 이미지를 작성하기 위해 픽셀 데이터에 IntPtr을 사용하는 이미지를 생성하는 생성자가 있습니다.

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

그런데 누군가가 나에게 보폭을 계산하는 방법을 말해 줄 수 있다면 좋을 것입니다. 이 같은

+0

is this is C#? C++? – Pod

+0

C#. 죄송합니다. 언급하지 않으 셨습니다. –

답변

13

당신은 GCHandle를 사용하여 안전하지 않은 코드없이이 작업을 수행 할 수 있어야합니다. 다음은 샘플입니다.

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

데이터를 복사하지 않고 다른 방법으로 갈 방법이 있습니까? – jjxtra

+0

이것은 데이터를 복사하지 않습니다. 그것은 당신이 관리 객체에 대한 포인터를 원하고 콜렉션이 일어날 때처럼 나를 움직이지 않는다고 GC에 알려주고 있습니다. – Bryan

+0

즉, 관리되지 않는 데이터를 복사하지 않고 관리되는 배열을 만들 수 있습니다. – jjxtra

6

를 사용하여 안전하지 않은 코드는 :

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

물론 intPtr은 배열을 가리키고 있습니다 * 컨트롤은 고정 된 블록에있는 *. 일단 고정 된 블록을 떠나면 가비지 컬렉터는 메모리에서 pArray를 자유롭게 움직일 수 있으며 따라서 intPtr은 가비지를 가리킬 수 있습니다. –

+0

이 'intPtr'은 고정 된 블록 내부에서만 볼 수 있습니다. –