Rumah > pembangunan bahagian belakang > C++ > Mengapa Saya Mendapat Ralat \'PinvokeStackImbalance\' dalam Visual Studio 2010 Apabila Memanggil C DLL daripada C#?

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
699 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!

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