[英]A call to PInvoke function [function name] has unbalanced the stack
我正在嘗試使用PInvoke調用非托管C ++ DLL,但出現錯誤(請參見下文)。 使用depends.exe
我可以在導出的函數列表中看到錯誤的名稱,因此也看到了奇怪的EntryPoint
名稱。 盡管出現此異常,但如果Step Over
調試時繼續執行“ Step Over
”功能,則函數將返回並且ptr
等於1,並顯示“成功”。
我嘗試了其他帖子中的一些建議,但沒有任何效果。 我認為uint32_t
很uint32_t
解釋。 我嘗試將C#PInvoke簽名更改為使用long
和ulong
但是仍然拋出異常,並且ptr
的值非常大。 我也嘗試過為DllImport
屬性設置CharSet
和ExactSpelling
屬性,但這似乎也不起作用。
我的問題是,我在做什么導致了異常,如果我不能/不應該忽略異常,那該怎么辦?
MyClass.h
class __declspec(dllexport) MyClass
{
public:
uint32_t runCommand(uint32_t start);
};
MyClass.cpp
uint32_t MyClass::runCommand(uint32_t start);
{
uint32_t status = 1;
return status;
}
P /調用簽名
[DllImport("myClass.dll",
EntryPoint = "?runCommand@MyClass@myClass@@QAEII@Z",
CallingConvention = CallingConvention.Cdecl)]
public static extern UInt32 runCommand(UInt32 baseAddress);
用法
public static void Do()
{
UInt32 a = 0xA000;
UInt32 ptr = runCommand(a);
Console.Write("Success!");
}
錯誤:
托管調試助手“ PInvokeStackImbalance”已在“ C:\\ Users ... \\ TestApp.vshost.exe”中檢測到問題。
附加信息:對PInvoke函數'TestApp!TestApp.CSMyClass :: runCommand'的調用已使堆棧不平衡。 這可能是因為托管PInvoke簽名與非托管目標簽名不匹配。 檢查PInvoke簽名的調用約定和參數是否與目標非托管簽名匹配。
使用Visual Studio 2015和C#應用程序是.NET Framework 4.6。
調用約定不匹配,這會導致堆棧不平衡。
由於runCommand
是MyClass
的成員函數 ,因此使用的調用約定不是 __cdecl
,而是__thiscall
(請注意,存在隱式的“ this
”指針作為參數傳遞給C ++類的非靜態成員函數)。
您可能要從DLL中導出純C接口函數(而不是C ++類成員函數)以進行P /調用,或者可以使用C ++ / CLI在本機代碼和托管代碼之間構建一個很小的橋接層,從而包裝您的代碼用C ++ / CLI編寫的.NET托管類中的C ++本機類,並使用C#中的托管類包裝器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.