13 years C/C++/C# programing, focus on embedded and mobile device development.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

程序中使用了平台互操作p/invoke在C#中调用MFC的DLL,在安装有VS2008开发环境的系统中程序均可正常运行,但是复制到其它机器上就不行了,.NET FRAMEWARK也都是最新版本,不知道怎么办。

A.dll 是别人用VC6.0开发的,里面导出了一个类,没有源码。
B.dll 是对A.dll的一个包装,VC++2008开发,将类的成员函数包装成全局函数,并导出。
C.dll 是对B.dll的一个包装, C#开发,使用P/Invoke调用B.dll中的函数.
D.exe 是最终程序,引用了C.dll

后来用Depends.exe分析,发现最终Debug目录中的B.dll使用了MSVCR90D.dll,奇怪的是这个文件却找不到,在安装了VS的机器上,即使找不到也能运行.

查了一些资料有说MSVCR100.dll可能有一个BUG, 跟编译模式也有关系, 于是使用RELEASE编译, 问题解决,到处都能运行了.

继续用Depends.exe分析,发现Release模式下的B.dll使用了MSVCR90.dll, 少了一个D结尾,应该是调试版本和正式版本之分. 此时才想到装了VS的环境里面有很多用于调试的DLL,而这些D结尾的DLL在安装MS的VC++2008可分发包的时候是没有包含的,因此导致了问题.

所以,一定不要图省事,把DEBUG版本的拿出来给用户用. 我知道很多人有都有这个习惯,坏习惯!!! 如果不早点客服,以后早晚会付出更大的代价来发现由此导致的问题。

posted on 2010-12-01 12:30  woaiusd  阅读(322)  评论(0编辑  收藏  举报