Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memperbaiki Pengecualian PinvokeStackImbalance dalam VS2010?

Bagaimana untuk Memperbaiki Pengecualian PinvokeStackImbalance dalam VS2010?

Barbara Streisand
Barbara Streisandasal
2024-11-03 21:17:29781semak imbas

How to Fix the PinvokeStackImbalance Exception in VS2010?

Betulkan Pengecualian PinvokeStackImbalance dalam VS2010

Pengecualian PinvokeStackImbalance, sebelum ini dilumpuhkan secara lalai dalam VS2008, telah didayakan secara lalai dalam VS2010 Pengecualian ini bertujuan untuk memaklumkan pembangun tentang konvensyen panggilan yang salah dalam panggilan DllImport.

Definisi Masalah

Apabila memindahkan penyelesaian daripada VS2008 ke VS2010, DllImport memanggil ke C DLL membuang pengecualian PinvokeStackImbalance secara konsisten, walaupun DLL itu sendiri tidak berubah.

Resolusi

Isu ini berpunca daripada konvensyen panggilan yang salah digunakan dalam pengisytiharan DllImport. Secara lalai, DllImport menggunakan CallingConvention.WinApi, yang bersamaan dengan CallingConvention.StdCall untuk kod desktop x86. Walau bagaimanapun, fungsi C yang mendasari diisytiharkan sebagai __cdecl, yang memerlukan CallingConvention.Cdecl.

Betulkan

Ubah suai perisytiharan DllImport untuk menyatakan secara eksplisit konvensyen panggilan yang betul:

<code class="csharp">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)]
static extern void FasterFunction(
    [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, //IntPtr inImage, 
    [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, //IntPtr outImage, 
    int inTotalSize, int inWindow, int inLevel);</code>

Nota Tambahan

  • Pengecualian ini hanya berlaku dalam mod penyahpepijatan terurus (MDA). Ia tidak akan dicetuskan dalam mod Keluaran.
  • Untuk mendapatkan maklumat lanjut tentang konvensyen panggilan, rujuk rujukan MSDN.

Atas ialah kandungan terperinci Bagaimana untuk Memperbaiki Pengecualian PinvokeStackImbalance dalam VS2010?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn