这两天项目在用C#调用C++编写的一些库时遇到一个很头痛的问题,用C++对DLL进行测试没有任何问题,可用C#进行调用时居然所有输出参数均未被改变,也就是输出没有任何输出,但返回值是正确的。同事调了两天,曾怀疑是函数调用约定问题,于是不断地在__cdecl和__stdcall的各种组合方式进行尝试,虽然明知道windows DLL使用的是__stdcall,但的确经过测试它不管用;后来实在不行,又创建了两个工程,写了几个简单的函数,再用C#调,却没有任何问题,而我们的工作代码却调用不成功;后来我还曾怀疑可能是inline函数的优化造成的问题,因为在DLL中导出的函数是__stdcall的,但接口函数里面只调用了一个函数,用的却是__cdec,有可能如果把导出函数直接替换成内层的函数,可能调用约定不正确(当然,这在理论上也不应成立的),于是关掉了编译器对inline函数的优化,依然无效。
今天快要下班的时候也闲下来了,我就开始处理这个问题,于时就尝试在C++的接口函数里添加断点,看C++函数是否正确执行并正常返回,于是启用了C#工程Debugging中的“Enable unmanaged code debugging”选项,奇迹发生了,C++代码的断点触发了,函数正常执行并返回,并且原来与C#的输出接口也正常了,数据被正常导出到C#代码中。难道是这个选项解决的问题?想想是不应该的,这个只是调试优化选项,而且创建的其它的测试工程也不需要启用这项的。于是又取消该项,再测,果然恢复原来错误的状态;然后,我又从DEBUG配置切换到Release配置,存在着同样的问题,只有启用了“Enable
unmanaged code debugging”程序才能正常运行。问题解决了,但是肯定不是正解,启用的选项中是启用对C++代码的调试功能的支持,不应该影响程序的正常执行,这应该是Visual Studio或CLR的一个BUG引起的。
在重构过程中还遇到一个有意思的问题:同事起的工程的名字不伦不类的,我给改了个名字security,于是生成security.dll,出现了一个奇怪的问题,明明我编译的DLL中导出了我要的函数,在C#中即怎么也找不到指定的函数,后来我把DllImport的DLL文件的参数使用绝对路径,问题就消失了,肯定是在DLL的搜索过程中先找到了一个security.dll,这里用的是那个文件而不是我的文件,所以没有找到我要的函数,再改个名就好了。在给动态链接库起名字的时候越规范、越标准越好,但随时都要注意别跟其它的系统文件重名了,否则就会出现这些“奇怪”的问题。
分享到:
相关推荐
visual studio 的bug
visual studio 2008 bug
软件名称: Visual Studio 2010 Help Downloader Plus 原 名 称: Visual Studio 2010 Help Downloader 原 官 网: http://vshelpdownloader.codeplex.com/ (已失效) 软件版本: 2.0.0.7 基础版本: 1.0.0.3 Beta ...
中文名: 使用Visual.Studio.2010进行软件测试 原名: Software Testing with Visual Studio 2010 作者: Jeff Levinson 资源格式: PDF 版本: 英文文字版 出版社: Addison Wesley书号: 9780321734488发行时间: 2011年03...
1、增加对dev10(Visual Studio 2010)版本的支持,至此“Visual Studio Help Downloader Plus”支持Visual Studio 2010以及其后所有已发布的版本,理论上也支持Visual Studio未来版本的支持,为庆祝此跨越,特将版本...
1、增加对dev10(Visual Studio 2010)版本的支持,至此“Visual Studio Help Downloader Plus”支持Visual Studio 2010以及其后所有已发布的版本,理论上也支持Visual Studio未来版本的支持,为庆祝此跨越,特将版本...
经过五天的修改和完善,所写计算器满足基本计算需求,近乎无bug。文本框只能输入数字或科学计数法;能够键盘输入但是不能后撤(功能可以实现但是会卡顿,暂未修复,所以并未添加此功能);用的VS传统界面,可能比较...
只要在VS2010源码编辑器中输入一个字符,它就报道错误了 "visual studio 2010 遇到了异常,可能是由某个扩展导致的......"。刚开始一看,以为是扩展引起的,那我就把vs中所有的扩展暂时禁用一下,结果bug还是依旧。...
MS官网上的 VSTO office runtime是10.0.6的,但是在XP环境下是有bug的,无法运行。因此要使用旧版本的runtime来解决这一问题。楼主在开发Excel插件时需要使用到该工具。
新版的《C#入门经典(第8版)》由三位专家联袂撰写,浓墨重彩地描述使用C# 7和Visual Studio 2017编写程序的基础知识,是编程新手的终极指南,不要求读者具有任何编程经验。书中讲述变量、流程控制、面向对象编程、Web...
14、修复dev14(Visual Studio 2015)加载语言时挂死(该bug由“远景论坛”的“铁浪”提交,在此表示感谢), 修改为默认加载"en-us"语言,如果没有该语言则显示提供的第一种语言; 2015.08.15日更新内容 15、增加在...
Visual Studio Code 官方最新版本 v1.14.0,新增诸多实用特性,修复许多bug。
Visual Studio 在编译C#时未能加载文件或程序集解决方案, 您一定可以通过它来解决这个问题!
NULL 博文链接:https://gstarwd.iteye.com/blog/561828
Visual Studio .NET使用技巧手册 作者 Minh T. Nguyen Visual Studio .NET是微软推出的功能最丰富,扩展性最强的编程工具。VS.NET中的功能与快捷方式不计其数,并且在每一个版本中都会明显增加。不熟悉这些节省时间...
有关已修复的 Bug 和已知问题列表,请参阅 Visual Studio 2015 Update 3 RC MSDN 文章。 支持的操作系统 Windows 7 Service Pack 1, Windows 8, Windows 8.1, Windows Server 2003 Service Pack 2, Windows ...
如果不懂如何设置的可以类比网上的vs透明主题(推荐MoeIDE而不是Claudia ) 本人只修改了environment 和 searchcontrol 以及 ...其余未做修改,如果bug可以反馈哟 反正我目前是还没遇到 更改字体和字体颜色食用效果更佳
基于 QT+Visual Studio 2019 的节目登记(UI用户界面) 节目报名包括并不限于如下... QT+Visual Studio 2019打开时会显示bug,不是真的有bug,是Visual Studio 2019和QT兼容性的问题导致检测bug迟钝。 运行不会有bug
随便写的小程序,只是对于多个批量更改比较方便,里面尚有BUG望指点,包涵!