Mengapa Saya Mendapat Ralat \'PinvokeStackImbalance\' dalam Visual Studio 2010 Apabila Memanggil C DLL daripada C#?

Mary-Kate Olsen
Lepaskan: 2024-11-02 21:42:30
asal
579 orang telah melayarinya

Why Do I Get

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:

  1. 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>
    Salin selepas log masuk
  2. Lumpuhkan MDA PinvokeStackImbalance:

    MDA PinvokeStackImbalance boleh dilumpuhkan dalam tetapan penyahpepijatan Visual Studio untuk mengelakkannya daripada mengganggu tugas penyahpepijatan yang lain.

    • Buka Alat Visual Studio > Menu pilihan.
    • Navigasi ke Menyahpepijat > Umum.
    • Nyahtanda pilihan "Dayakan pembantu penyahpepijatan terurus".

Pertimbangan Tambahan:

  • MDA PinvokeStackImbalance tidak didayakan secara lalai dalam mod Keluaran, jadi isu tidak akan berlaku apabila membina untuk keluaran.
  • Untuk maklumat lanjut, rujuk dokumentasi MSDN tentang penghitungan CallingConvention (https://docs.microsoft .com/en-us/dotnet/framework/unmanaged-api/calling-conventions-for-platform-invoke#the-callingconvention-enumeration).

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan