繁体   English   中英

使用双数组和void指针的PInvoke函数调用中的AccessViolationException

[英]AccessViolationException in PInvoke function call with double arrays and void pointers

我想通过具有以下签名的PInvoke从具有纯C接口的DLL中调用两个函数:

void *pj_init_plus(const char *srsName);
int pj_datum_transform(void *src, void *dst, long point_count, int point_offset,
                    double *x, double *y, double *z );

Pinvoke方法:

[DllImport("proj.dll", CallingConvention = CallingConvention.Cdecl, 
    EntryPoint = "pj_init_plus", CharSet = CharSet.Ansi)]
public static extern IntPtr PjInit(string srsName);

[DllImport("proj.dll", EntryPoint = "pj_transform", CallingConvention =
    CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int PjTransformation(IntPtr src, IntPtr dst,long pointCount,
    int pointOffset, double[] x, double[] y,double[] z);

在我的C#代码中,我调用方法:

IntPtr pjSrc = PjInit("+proj=longlat +datum=WGS84 +no_defs");
IntPtr pjDst = PjInit("+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs");

double[] x = { 4489580.7, 4489580.7 };
double[] y = { 5320767.7, 5320767.7 };
double[] z = { 0.0, 0.0};

PjTransformation(pjSrc, pjDst, x.Length, 1, x, y, z);

PjInit调用可以正常工作并返回有效的指针。 但是调用PjTransformation会引发AccessViolationException-Exception。 我认为双数组有问题。 在一篇文章中提到,clr阵列已经与本机阵列兼容,无需手动编组。 我还尝试使用双数组的属性[MarshalAs(UnmanagedType.LPArray)],但是这样做没有帮助。 或者,异常可能来自于从第一个函数调用作为空指针返回的结构。 问题是我不知道该结构的类型。

dll功能还可以,我尝试使用本机C代码运行,并且可以正常工作。 同样,参数pointOffset不会导致异常。

您的P调用声明看起来不错且有效。 我能想到的唯一问题是AV异常是从本机函数本身引发的,而不是在进行封送处理时引发的。

我建议您尝试使用本机调试器调试代码,然后可以找出引发异常的确切代码行,并诊断在编组或实际执行函数期间是否出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM