程序中使用了平台互操作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版本的拿出來給用戶用. 我知道很多人有都有這個習慣,壞習慣!!! 如果不早點客服,以後早晚會付出更大的代價來發現由此導致的問題。