日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误

發布時間:2023/11/27 生活经验 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從.NET1.1升級到.NET2.0時出現的PInvokeStackImbalance錯誤 微軟官方的解釋(http://msdn2.microsoft.com/zh-cn/library/0htdy0k3.aspx) 如果 CLR 檢測到平臺調用之后的堆棧深度與 DllImportAttribute 屬性指定的調用約定中以及托管簽名的參數聲明中提供的預期堆棧深度不匹配,則將激活 PInvokeStackImbalance 托管調試助手 (MDA) ? 下面將舉一個具體的例子 PCCamera(UserLib.Device.PCCamera攝像頭類)在從.NET1.1升級到.NET2.0時出現的PInvokeStackImbalance錯誤: 檢測到 PInvokeStackImbalance Message: PInvoke 函數“WindowsApplication1!UserLib.Device.PCCamera::SendMessage”的調用導致堆棧不對稱。原因可能是托管的 PInvoke 簽名與非托管的目標簽名不匹配。請檢查 PInvoke 簽名的調用約定和參數與非托管的目標簽名是否匹配。 錯誤首次發生在這一行代碼: SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); 經過分析發現所有調用SendMessage函數的地方都會出現以上錯誤 于是查看DLLImport: [DllImport("User32.dll")] private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, long lParam); 原來是因為WinAPI的long類型是32位的,而C#的long是64位的,這就導致堆棧不對稱,引發錯誤. ? 原因:(http://discuss.develop.com/archives/wa.exe?A2=ind0512c&L=dotnet-winforms&D=0&T=0&P=8094) .NET2.0中加入了MDA(managed debugging assistant), 在平臺調用時后會檢查棧的指針, 如果發現不平衡, 就會拋出PInvokeStackImbalance異常; 而在.NET1.1中不會檢查, 所以不會捕獲到異常, 但在運行時會導致不穩定. ? 解決方法: 將最后一個long lParam 改為 int wParam”, 因為C#int32位的. 并且將之后有涉及到SendMessage函數的參數適當地轉成int型就可以了. 但是, 之后查閱了資料http://www.pinvoke.net/default.aspx/user32/SendMessage.html 發現先前的解決方案還有不合適的地方, 應該將其中的 ”wParm” ”lParm” 參數的類型都轉成IntPtr類型,并且將后面涉及到的參數的 ”0” 改為 “IntPtr.Zero”. 因為如果使用int類型,那么這段代碼在64位的Windows上面將會無法正常運行. ? 總結: ?????? 我們在調用WinAPI時要特別小心, 因為WinAPIC#的數據類型不是完全一樣, 就好像在WinAPI中的long類型在C#中就是int類型, 如果沒有處理好類型問題, 就很可能會導致堆棧的不平衡,引發PInvokeStackImbalance錯誤, 但是這類錯誤在.NET1.1下不會被暴露出來, 所以在從.NET1.1升級到.NET2.0時要特別注意此類問題.

轉載于:https://www.cnblogs.com/symbol441/archive/2007/11/02/946945.html

總結

以上是生活随笔為你收集整理的从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。