C#调用非托管dll,如何把数组作为参数传递进dll?
现用delphi编写一dll
function sum(a1:array of double):double;stdcall; //用于测试,具体功能并不仅限于求和
var
data:double;
i:integer;
begin
for i:=0 to length(a1)do
begin
data:=data+a1[i];
end;
result:=data;
end;
现在C#调用时,
[DllImport("SUM.dll", EntryPoint = "sum", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern double sum(double[] x1);
double[] a1 = new double[4];
double d1;
for (i = 0; i <= 3; i++)
{
a1[i] = i + 10;
}
d1 = sum(a1);//报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
return d1;
后来我稍微修改了一下,不传入数组,直接传递一个double值,却能成功。
我在网上查了一下,要使用MarshalAs类先对数组进行封送至非托管内存,
IntPtr ptr = Marshal.AllocHGlobal(a1.Length);//申请非托管内存块(与a1大小一样)
Marshal.Copy(a1,0,ptr,a1.Length);//将托管数据复制到非托管数据
然后具体怎么处理呀!不明白呀,困扰几天了,知道的朋友万分感谢!