문제

int **를 메소드의 매개 변수 중 하나로 원하는 제 3 자 DLL을 사용하려고합니다. 메모리 할당을 가리킬 포인터의 주소로 매개 변수를 설명합니다.

혼란에 대해 죄송합니다. 매개 변수는 내가 생각하는 양방향입니다. DLL은 FPGA 보드와 대화하기위한 것이며 방법은 호스트 PC와 PCI 보드간에 DMA 전송을 설정하고 있습니다.

도움이 되었습니까?

해결책

By-Ref를 사용하십시오 System.IntPtr.

 [DllImport("thirdparty.dll")]
 static extern long ThirdPartyFunction(ref IntPtr arg);

 long f(int[] array)
  { long retval = 0;
    int  size   = Marshal.SizeOf(typeof(int));
    var  ptr    = IntPtr.Zero;

    try 
     { ptr = Marshal.AllocHGlobal(size * array.Length);

       for (int i= 0; i < array.Length; ++i) 
        { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size));
          Marshal.StructureToPtr(array, tmpPtr, false);
        }

       retval = ThirdPartyFunction(ref ptr);
     }
    finally 
     { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr);
     }

    return retval;
  }

다른 팁

이 경우 마샬 클래스를 사용하거나 안전하지 않아야합니다.

배열에 대한 포인터 일 수도 있으므로 ref int[] list 작동 할 수도 있습니다.

int **는 intptr의 배열이 될 것입니다. 설명에서 C ++/CLI를 사용하여 관리되지 않은 int **에서 관리되는 배열로의 변환을 도울 수 있다고 생각합니다.^>^^

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top