vs2010环境下,C#调用C++的dll过程中常见三大问题(内存损坏、托管调试堆栈不对称、调试dll)及解决方案

Problem1:C# 尝试读取或写入受保护的内存,这通常指示其他内存已损坏。System.AccessViolationException

Solution1:dll项目中的函数声明:CPPDLLEXPORT_API void bayes(char* inFileName,float* Tex,int &classifier);

c#项目中的函数声明如下:[DllImport(@"..........\cppdllexport.dll", EntryPoint = "bayes")]
        extern static int bayes(string inFileName, Single[] Tex, int classifier);

解决方案将dll函数声明中的引用符号去掉。maybe C# 中不支持引用或者其它原因。

 

Problem2:发生了 PInvokeStackImbalance
Message: 托管调试助手“PInvokeStackImbalance”在“C:\...\csdllimport.exe”中检测到问题。
其他信息: 对 PInvoke 函数“....”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

Solution2:在C#中修改配置,解决方案视图---》项目----》属性-----》应用程序-----》目标框架,从.Net 4.0改为.Net 3.5即可

 

Problem3:遇到的是项目中的实际问题。需要调试C++的dll函数。在vs2010环境中,其大概调试步骤如下:

a、在“解决方案视图”中找到要调试的dll项目,点击右键,将dll设置为调试启动项目;然后选择dll项目打开属性页设置页面;

b、在属性页面的中,选择配置属性下拉菜单,然后选择调试;

c、在调试页面中,选择要启动的调试器的下拉菜单中,有本地调试,远程调试可选择;

d、在调试页面中,命令中选择下拉菜单,找到引用该dll的应用程序;在命令参数中输入$(TargetFileName),或者自己从下拉框中选择,然后在此字符串后面 输入dll文件导出的函数名:

最终的形式为:$(TargetFileName) bayestrain; bayestest

工作目录下拉菜单,选择当前工作目录,即“.”。

大致步骤截图如下:

vs2010环境下,C#调用C++的dll过程中常见三大问题(内存损坏、托管调试堆栈不对称、调试dll)及解决方案_第1张图片 标设置dll为其它.exe应用程序的方法


 

你可能感兴趣的:(vs2010环境下,C#调用C++的dll过程中常见三大问题(内存损坏、托管调试堆栈不对称、调试dll)及解决方案)