.net 4中的pInvokeStackImbalance MDA默认是开启的
Contents
今天把我之前发的一个小工具FreeEverything(基于everything的一个简易磁盘清理工具)升级到了.net framework 4.5,并且去掉了对mvvmlight的依赖。结果在测试运行的时候发现如果用visual studio调试运行,就会触发一个break,显示如下的错误信息。
1 | A call to PInvoke function 'SampleMethod' has unbalanced the stack. |
但是在之前的3.5上就没有问题,报错的地方在下面的语句。
1 | EverythingWraper.Everything_Query(); |
于是就调查了一下,发现在pInvokeStackImbalance MDA(managed debugging assistant)在.net 3.5中是默认关闭的,如果开启需要到debug->exception->mda来打开。但是在.net 4中默认改成了开启,这就解释了为啥在3.5上没问题,但是在4.5上有问题。
如果dllimport时C#中的函数签名和非托管的dll中的函数签名不一致比如参数数目,或者参数大小不对,或者calling convention不对,就会触发visual studio报这个错。
但是为什么会出这个错误呢?我的dllimport是从 Everything SDK Wiki上的示例代码考过来的,如下所示:
1 | [ ] |
于是我就又打开了Everything的SDK,看了看源代码,发现其实Everything_Query()是有一个参数的,因为参数不匹配,所以visual studio就报了这个错。修改成如下就没问题了。
1 | [ ] |