簡體   English   中英

來自 HDFDotNet 1.8.7 的“檢測到 PInvokeStackImbalance”

[英]“PInvokeStackImbalance was detected” from HDFDotNet 1.8.7

我一直在嘗試更新到最新的 HDF5DotNet 包裝器(1.8.7)並收到以下警告(從 VS2010 在 DEBUG 模式下運行時):

檢測到 PInvokeStackImbalance 消息:對 PInvoke function 'HDF5DotNet::.H5Fopen' 的調用使堆棧不平衡。 這可能是因為托管 PInvoke 簽名與非托管目標簽名不匹配。 檢查 PInvoke 簽名的調用約定和參數是否與目標非托管簽名匹配。

我正在使用預編譯的二進制文件(用於 .NET Framework 4.0 32 位的 HDF5DotNet 程序集),但是當我從源代碼編譯時得到了相同的結果。

奇怪的是,當我在非調試模式下執行調用 HDF5DotNet 包裝器的應用程序時,我沒有發現任何問題。 我確實注意到在 1.8.6 和 1.8.7 之間所有的調用約定都從 Cdecl 切換到了 StdCall。 這可能是造成這種情況的原因嗎? 我看過其他論壇說 CallingConvention 應該是 Cdecl ......

謝謝!

是的,將stdcall function 調用為cdecl或反過來會導致堆棧不平衡。 這些約定之間的主要區別在於,對於cdecl調用者負責從堆棧中刪除 arguments,而對於 stdcall,則由被調用者負責。

我猜在發布模式下你有同樣的錯誤。 但是您不會收到錯誤消息,因為某些運行時檢查被禁用。 在您使用錯誤的調用約定的大多數情況下,本機程序會崩潰,但似乎 .net 互操作代碼具有更強大的堆棧處理來掩蓋此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM