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.
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