我有一个用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)
}
当我调用该函数时,发生了一些非常糟糕的事情,导致调试环境失败:
这似乎是在从托管到非托管的过渡期间发生的,因为在非托管代码的第一行上设置的断点未被命中。实际上,模块窗口显示我未加载非托管DLL。
我的猜测是参数声明有问题。 似乎建议人们应该将多维数组视为C ++方面的单维数组,但这不是文档所说的。任何人都可以看到导致崩溃的原因吗?
更新
事实证明接口很好,非托管代码中的未处理异常导致崩溃。我仍然不知道为什么DLL没有显示为在模块窗口中加载,以及为什么调试器没有达到我在非托管代码中设置的断点。