PinvokeStackImbalance Ralat dalam Visual Studio 2010
Soalan:
Setelah menaik taraf kepada Visual Studio 2010 , pengguna menghadapi pengecualian "pinvokestackimbalance" yang berterusan apabila menggunakan C DLL daripada aplikasi C#. Pengecualian ini tidak terdapat dalam Visual Studio 2008.
Jawapan:
Pengecualian ini timbul disebabkan oleh perubahan dalam kelakuan lalai pembantu penyahpepijatan terurus (MDA) dalam Visual Studio 2010. Untuk menyelesaikan isu ini, pertimbangkan langkah berikut:
Betulkan Konvensyen Panggilan:
Punca utama pengecualian ialah tetapan konvensyen panggilan yang salah. Dalam Visual Studio 2010, konvensyen panggilan lalai untuk DllImport ialah CallingConvention.WinApi, yang bersamaan dengan CallingConvention.StdCall untuk aplikasi desktop x86. Walau bagaimanapun, C DLL dalam kes ini menjangkakan konvensyen panggilan Cdecl.
Untuk membetulkan ini, edit atribut [DllImport] dalam kod C# untuk menyatakan secara eksplisit CallingConvention.Cdecl.
<code class="cs">[DllImport("ImageOperations.dll", CallingConvention = CallingConvention.Cdecl)] static extern void FasterFunction( [MarshalAs(UnmanagedType.LPArray)]ushort[] inImage, [MarshalAs(UnmanagedType.LPArray)]byte[] outImage, int inTotalSize, int inWindow, int inLevel);</code>
Lumpuhkan MDA PinvokeStackImbalance:
MDA PinvokeStackImbalance boleh dilumpuhkan dalam tetapan penyahpepijatan Visual Studio untuk mengelakkannya daripada mengganggu tugas penyahpepijatan yang lain.
Pertimbangan Tambahan:
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat \'PinvokeStackImbalance\' dalam Visual Studio 2010 Apabila Memanggil C DLL daripada C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!