Megosztás a következőn keresztül:


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>

Lásd még