将指针从C#传递到c DLL

问题描述 投票:0回答:2

我有一个包含double *参数的dll,例如xyz(double * a,double * b)。我正在使用此DLL将两个双精度数组传递给函数xyz。问题是当我使用a通过引用传递一个双精度数组时,该数组正在更新,但是值四舍五入,这是在您与int进行类型转换时发生的。您能告诉我一种有效的方法,将这个双精度数组发送到c dll并以十进制获取所需结果。 (不选择更改DLL)。我也尝试过元帅,我不完全确定自己是否做对了,但是每当我过去将xyz的参数更改为xyz(IntPtr a,double * b)或用来获取AccessViolationException的东西时,都会损坏内存。

c# arrays pointers marshalling dllimport
2个回答
0
投票

如果我理解正确,您正在将数组从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()分配给大小。


0
投票

尝试以下内容:

            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)
© www.soinside.com 2019 - 2024. All rights reserved.