从int []转换为int *

时间:2014-08-27 12:11:40

标签: c# c++

我有一个C ++ .DLL和C#应用程序。在DLL中我有一个像:

这样的函数

namespace Sample { public ref class SampleClass { public: int f(int arr[], int length); }; }

如何从C#应用程序中调用它?问题是在C ++中我只能使用int*参数而不能在c#中声明int[]int[]变量。

我曾尝试在C#中声明int*[]类型,但由于

,这是不可能的
  

无法获取托管类型的地址

错误。我不知道如何将数组放入此函数中。

UPD: 试图像

那样痴迷
[DllImport("samplelib.fll", EntryPoint = "Sample.SampleClass.f")] 

但这似乎是错误的。

2 个答案:

答案 0 :(得分:0)

我不确定,如果这是你想要的。你的例子似乎有点不完整......

让我们说你在C / C ++中有这样的东西:

void TakesAnArray(int size, int array[]) {
   printf_s("[unmanaged]\n");
   for (int i=0; i<size; i++)
      printf("%d = %d\n", i, array[i]);
}

然后你想从C#调用ist,所以你创建了一个包装类。

internal static class NativeMethods
{
   [DllImport("SomeLib.dll" )]
   public static extern void TakesAnArray(int size, [In, Out] int[] array);
}

答案 1 :(得分:0)

int[] arr = new int[10];
int ptrsize = arr.Length * Marshal.SizeOf(typeof(int));
IntPtr arrptr = Marshal.AllocHGlobal(ptrsize);
Marshal.Copy(arr, 0, arrptr, ptrsize);
NativeFunction(arr.Length, arrptr);
//after
Marshal.FreeHGlobal(arrptr);

将数组用作指针

void NativeFunction(int length, int* array) { /*...*/ }

导入(。\\是可执行路径)

[DllImport(".\\MyLib.dll")]
static extern void NativeFunction(int length, IntPtr array);