簡體   English   中英

調用PInvoke函數[函數名]使堆棧不平衡

[英]A call to PInvoke function [function name] has unbalanced the stack

我正在嘗試使用PInvoke調用非托管C ++ DLL,但出現錯誤(請參見下文)。 使用depends.exe我可以在導出的函數列表中看到錯誤的名稱,因此也看到了奇怪的EntryPoint名稱。 盡管出現此異常,但如果Step Over調試時繼續執行“ Step Over ”功能,則函數將返回並且ptr等於1,並顯示“成功”。

我嘗試了其他帖子中的一些建議,但沒有任何效果。 我認為uint32_tuint32_t解釋。 我嘗試將C#PInvoke簽名更改為使用longulong但是仍然拋出異常,並且ptr的值非常大。 我也嘗試過為DllImport屬性設置CharSetExactSpelling屬性,但這似乎也不起作用。

我的問題是,我在做什么導致了異常,如果我不能/不應該忽略異常,那該怎么辦?

非托管C ++

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;
}

托管C#

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。

調用約定不匹配,這會導致堆棧不平衡。

由於runCommandMyClass成員函數 ,因此使用的調用約定不是 __cdecl ,而是__thiscall (請注意,存在隱式的“ this ”指針作為參數傳遞給C ++類的非靜態成員函數)。

您可能要從DLL中導出純C接口函數(而不是C ++類成員函數)以進行P /調用,或者可以使用C ++ / CLI在本機代碼和托管代碼之間構建一個很小的橋接層,從而包裝您的代碼用C ++ / CLI編寫的.NET托管類中的C ++本機類,並使用C#中的托管類包裝器。

暫無
暫無

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

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