PInvokeStackImbalance MDA
Feljegyzés
Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.
A PInvokeStackImbalance
felügyelt hibakeresési segéd (MDA) akkor aktiválódik, amikor a CLR észleli, hogy a platformhívás utáni veremmélység nem egyezik meg a várt veremmélységtel, tekintettel az DllImportAttribute attribútumban megadott hívási konvencióra és a felügyelt aláírás paramétereinek deklarálására.
Az PInvokeStackImbalance
MDA csak 32 bites x86-platformokra van implementálva.
Feljegyzés
Az PInvokeStackImbalance
MDA alapértelmezés szerint le van tiltva. A Visual Studio 2017 és újabb verzióiban az PInvokeStackImbalance
MDA megjelenik a Felügyelt hibakeresési segédek listában a Kivételbeállítások párbeszédpanelen (amely a Windows>kivételbeállítások hibakeresésekor >jelenik meg). A Break When Thrown jelölőnégyzet bejelölése vagy törlése azonban nem engedélyezi vagy tiltja le az MDA-t, csak azt szabályozza, hogy a Visual Studio kivételt jelez-e az MDA aktiválásakor.
Hibajelenségek
Az alkalmazások hozzáférés-megsértést vagy memóriasérülést tapasztalnak a platformhívások indításakor vagy követésekor.
Ok
Előfordulhat, hogy a platformhívás felügyelt aláírása nem egyezik a meghívott metódus nem felügyelt aláírásával. Ezt az eltérést az okozhatja, hogy a felügyelt aláírás nem deklarálta a paraméterek megfelelő számát, vagy nem adja meg a paraméterek megfelelő méretét. Az MDA azért is aktiválható, mert az attribútum által DllImportAttribute esetleg megadott hívási konvenció nem egyezik a nem felügyelt hívási konvencióval.
Resolution (Osztás)
Tekintse át a felügyelt platform aláírási és hívási konvencióját, és ellenőrizze, hogy megfelel-e a natív cél aláírási és hívási konvenciójának. Próbálja meg explicit módon megadni a hívási konvenciót mind a felügyelt, mind a nem felügyelt oldalakon. Az is lehetséges, bár nem olyan valószínű, hogy a nem felügyelt függvény valamilyen más okból, például a nem felügyelt fordító hibája miatt kiegyensúlyozatlanná tette a vermet.
Effektus a futtatókörnyezetre
Kényszeríti az összes platform hívását a CLR nemoptimalizált elérési útjának eléréséhez.
Hozam
Az MDA üzenet a platformhívási metódushívás nevét adja meg, amely a verem kiegyensúlyozatlanságát okozza. A platformhívási metódus SampleMethod
mintaüzenete a következő:
A "SampleMethod" PInvoke függvény hívása kiegyensúlyozta a vermet. Ennek oka valószínűleg az, hogy a felügyelt PInvoke-aláírás nem egyezik a nem felügyelt céladék aláírásával. Ellenőrizze, hogy a PInvoke-aláírás hívási konvenciói és paraméterei megegyeznek-e a cél nem felügyelt aláírással.
Konfiguráció
<mdaConfig>
<assistants>
<pInvokeStackImbalance />
</assistants>
</mdaConfig>