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

时间:2013-10-10 18:53:53

标签: c# pinvoke proj

我想通过带有以下签名的PInvoke从具有pure-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-array已经与本机数组兼容了 不必手动编组。我也尝试使用属性[MarshalAs(UnmanagedType.LPArray)]作为双数组,但这没有帮助。或者,Exception可以来自结构,该结构作为第一个函数调用的void指针返回。问题是我不知道结构的类型。

dll函数没问题,我用原生c代码试了一下它就可以了。参数pointOffset也不会导致异常。

1 个答案:

答案 0 :(得分:0)

您的P-invoke声明看起来很好且有效。我能想到的唯一问题是AV异常是从本机函数本身抛出的,而不是在编组时发生的。

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