2011-12-30 2 views
1

임의 유형의 배열의 첫 번째 요소의 메모리 주소를 가져와야합니다.이 배열은 Object 유형으로 저장됩니다. 예를 들어 배열은 double [] 또는 int [] 일 수 있지만 코드에서는 Object로 입력됩니다.객체로 저장된 배열의 첫 번째 요소 주소 얻기

알려진 유형의 배열 주소를 얻는 것은 간단하지만 C#에서는 개체의 주소를 가져올 수 없습니다. 배열을 저장하는 데 사용할 수 있고 메모리 주소를보다 쉽게 ​​얻을 수있는 유형 (Object가 아닌)이 있습니까? 또는 Interop/Reflection을 사용하여 중간 데이터 복사본이 없어도 직접 주소에 액세스 할 수있는 방법이 있습니까?

두 번째 줄에는 double []가 개체로 저장되어 있습니다. 그리고 fixed() 줄에서 o의 주소를 얻으 려한다는 것을 알아 채십시오. o는 C#에서는 허용되지 않습니다.

미리 감사드립니다.

int len=100; 
object o = new double [len]; 

    unsafe 
    { 
       fixed(int*ptr=&o) 
       for (int index = 0; index < len; index++) 
       { 
        // access data directly to copy it, etc... 
       } 

    } 
+1

왜이 작업을 수행하려고합니까? –

+0

이것은 정확히 질문에 대답하지 않으므로 (주석이므로), 'Array' 유형의 참조를 선언하고'Array' 클래스를 사용하여 원하는 대부분의 것을 할 수 있습니다 (예 :'Array.Copy()'. – phoog

+1

@Robert : DirectCompute 작업과 관련된 몇 가지 작업을 자동화하고 싶습니다. 데이터를 앞뒤로 복사하는 자동화 된 개체를 사용하여 CPU 구조체 배열을 GPU 버퍼에 바인딩하고 중복 코드 양을 줄이려고합니다. –

답변

4

당신은 GCHandle를 사용하여이를 수행 할 수 있습니다

int len=100; 
object x = new long[len]; 
unsafe 
{ 
    var gch = GCHandle.Alloc(x, GCHandleType.Pinned); 
    try 
    { 
     void* addr = (void*)gch.AddrOfPinnedObject(); 
     // do whatever you want with addr 
    } 
    finally 
    { 
     gch.Free(); 
    } 
} 

그냥 당신이 정말 필요하다는 것을 확인하십시오.

+0

고마워! 이 작동합니다. GC에 개체를 고정해야하는 것이 싫지만 문제가 해결됩니다. @ 로버트에 대한 제 응답에서 나는 무엇을하려고하는지 설명합니다. –