在C#中调用PInvoke崩溃

时间:2015-12-13 10:02:36

标签: c++ .net pinvoke

我有一个用C ++编写的库,我想从我的托管C#代码中调用它。 根据{{​​3}},我应该能够在托管代码中进行以下声明:

[DllImport("PatternTracking.dll",
        EntryPoint = "tracker",
        CallingConvention = CallingConvention.Cdecl,
        CharSet = CharSet.Ansi)]
    public static extern void dukeTracker(
        [In, Out] int[,] imgOrig, [In, Out] int[,] refImgOrig,  //<-Input
        int x0, int y0,                                         //<-Input
        ref double maxCC, ref int xTrack, ref int yTrack);      //<-Output

C ++中的函数签名如下:

extern "C" {
__declspec(dllexport) void tracker(int imgOrig[NY][NX], int refImgOrig[NY][NX],     //int imgScopeBW_Orig[NY][NX],              //<-Input
    int x0, int y0,//int nx_template,int ny_template,                                   //<-Input
    double *maxCC, int *xTrack, int *yTrack)    

}

当我调用该函数时,发生了一些非常糟糕的事情,导致调试环境失败:

this documentation

这似乎是在从托管到非托管的过渡期间发生的,因为在非托管代码的第一行上设置的断点未被命中。实际上,模块窗口显示我未加载非托管DLL。

我的猜测是参数声明有问题。 Error Message似乎建议人们应该将多维数组视为C ++方面的单维数组,但这不是文档所说的。任何人都可以看到导致崩溃的原因吗?

更新

事实证明接口很好,非托管代码中的未处理异常导致崩溃。我仍然不知道为什么DLL没有显示为在模块窗口中加载,以及为什么调试器没有达到我在非托管代码中设置的断点。

0 个答案:

没有答案