我有一个包含double *参数的dll,例如xyz(double * a,double * b)。我正在使用此DLL将两个双精度数组传递给函数xyz。问题是当我使用a通过引用传递一个双精度数组时,该数组正在更新,但是值四舍五入,这是在您与int进行类型转换时发生的。您能告诉我一种有效的方法,将这个双精度数组发送到c dll并以十进制获取所需结果。 (不选择更改DLL)。我也尝试过元帅,我不完全确定自己是否做对了,但是每当我过去将xyz的参数更改为xyz(IntPtr a,double * b)或用来获取AccessViolationException的东西时,都会损坏内存。
如果我理解正确,您正在将数组从C#传递到C(或C ++)代码。直接将数组发送到xyz(double* a, double* b)
之类的方法的方法的问题在于,代码无法知道数组的大小。一旦C / C ++代码尝试访问超出数组范围的元素,这可以使您获得访问冲突异常。
有多种解决方法-通过C#使用SafeArray(已经包含size属性),将数组发送到具有大小的桥接方法,或将数据传递到结构中,如下所示:
internal struct ArraysStruct
{
public int floatArraySize;
public IntPtr floatArray;
public int uintArraySize;
public IntPtr uintArray;
}
然后在C / C ++端将通过类似以下内容进行匹配:
typedef struct ArraysStruct
{
size_t floatArraySize;
float* floatArray;
size_t uintArraySize;
unsigned int* uintArray;
}
[完成后,您需要使用Marshal.AllocHGlobal()
将数组分配为大小(在C#中),然后使用Marshal.FreeHGlobal()
分配给大小。
尝试以下内容:
double[] a = { 1.23, 2.34, 5.45 };
IntPtr aptr = Marshal.AllocHGlobal(a.Length * sizeof(double));
Marshal.Copy(a, 0, aptr, a.Length);
double[] b = { 1.23, 2.34, 5.45 };
IntPtr bptr = Marshal.AllocHGlobal(b.Length * sizeof(double));
Marshal.Copy(b, 0, bptr, b.Length);
xyz(aptr, bptr)