"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا تعايش C# `cdecl` وتوقيعات C ++` __stdcall` في P/invoke؟

لماذا تعايش C# `cdecl` وتوقيعات C ++` __stdcall` في P/invoke؟

نشر في 2025-03-24
تصفح:470

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

c# cdecl و c __ stdcall في P/استدعاء عملية التشغيل البيني بين C# و C ، غالبًا ما تكون وظائف C# تستخدم

CDECL

اتفاقية الاتصال ، في حين أن وظائف C المقابلة تستخدم توقيع __ stdcall ينبع هذا عدم التطابق من اختيار اتفاقية المكالمات التي استمرت تاريخيا حتى يومنا هذا.

__ stdcall : يقوم متصل دالة Windows بتنظيف

__ stdcall

يرث من اتفاقية استدعاء Pascal 16 بت وهي اتفاقية الاتصال الافتراضية لوظائف Windows API و com. يحدد أن Callee (الوظيفة التي يتم استدعاؤها) تنظف المكدس بعد التنفيذ ، مما يجعله أكثر إحكاما في البيئات المقيدة للموارد. ومع ذلك ، إذا كان عدد المعلمات المتوقعة من قبل المتصل و Callee لا يتطابق ، فإن هذه الميزة تشكل خطر اختلال التوازن.

__ cdecl : Caller Cleaning of the Topable Parameter function ]]

__ CDECL

هي اتفاقية استدعاء قياسية في C للوظائف ذات عدد متغير من المعلمات ، مثل تضع هذه الاتفاقية مسؤولية تنظيف المكدس على المتصل ، لأن المتصل يعرف عدد المعلمات التي تم تمريرها. نسيت تحديد callingconvention.cdecl في [dllimport] . __ thiscall : إخفاء هذا المؤشر لطريقة C

] __ ThisCall يشير بشكل خاص إلى C ، والذي يتولى مرور تمرير هذا

في طريقة مثيل الفصل. إنه مشابه لـ

__ cdecl ، لكن .net p/invoke لا يدعمها معالج markalling وبالتالي فهو غير مناسب لرمز Pinvoke C. تلخيص إن التعايش مع

CDECL

. يعد الفهم الصحيح لهذه الاتفاقيات ، وكذلك

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3