„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum koexistieren C# `CDecl` -Anrufe und C ++` __stdcall` -Signaturen in P/Invoke?

Warum koexistieren C# `CDecl` -Anrufe und C ++` __stdcall` -Signaturen in P/Invoke?

Gepostet am 2025-03-24
Durchsuche:222

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

c# cDecl und c __ stdcall Gründe für die Koexistenz in p/invoke

In P/invoke Interoperabilität zwischen C# und c ist es häufig der Fall, dass C# -Funktionen die CDecl Konvention verwenden, während ihre c entsprechenden Funktionen die __ stdcall Signatur verwenden. Diese Nichtübereinstimmung stammt aus der Auswahl der Call Convention, die historisch bis heute fortgesetzt wurde.

__ stdcall : Der Anrufer der Windows -Funktion reinigt

__ stdcall erbt aus der 16-Bit-Pascal-Aufrufkonvention und ist die Standardkonvention für Windows-API-Funktionen und com. Es gibt an, dass die Callee (die Funktion, die aufgerufen wird) den Stapel nach der Ausführung reinigt und ihn in ressourcenbeschränkten Umgebungen kompakter macht. Wenn jedoch die Anzahl der vom Anrufer und des Callee erwarteten Parameter nicht übereinstimmt, stellt dieser Vorteil das Risiko eines Stapelungleichgewichts dar.

__ cDecl : Anruferreinigung der mutablen Parameterfunktion

]

__ cDecl ist eine Standardkonvention in C für Funktionen mit variabler Nummer von Parametern wie printf () und scanf () . Diese Konvention überträgt den Anrufer für die Stapelreinigung, da der Anrufer die Anzahl der übergebenen Parameter kennt. Ich habe vergessen zu spezifizieren callconvention.cdecl in der [dllimport] Deklaration in C# ist eine gemeinsame Fallstrick.

__ thiscall : Verstecken Sie diesen Zeiger von c method

]

__ thiscall bezieht sich ausdrücklich auf c, das verarbeitet Hidden this Zeiger in der Instanzmethode der Klasse. Es ähnelt __ cDecl , aber der .NET p/Invoke Marshalling -Handler unterstützt es nicht und ist daher nicht für Pinvoke C -Code geeignet.

Zusammenfassen

Die Koexistenz des

cDecl rufen Sie in C# und die __ stdcall in C das Ergebnis dieser historischen Anrufkonventionen und jeder sprachspezifischen Anforderungen an. Das ordnungsgemäße Verständnis dieser Konventionen sowie der Eintragspunkt und exactSpelling Eigenschaften von sind entscheidend, um die korrekte P/Invoke -Funktionalität zu gewährleisten und potenzielle Probleme wie Stapelmallien zu vermeiden.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3