[英]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.