2016-01-16 22 views
5

Bei der Interaktion mit einer nativen 64-Bit-Bibliothek über eine explizite 64-Bit-.NET-Anwendung über P/Invoke wird die CallingConvention-Eigenschaft im Attribut DllImport effektiv ignoriert?Wird CallingConvention in 64-Bit-.NET-Anwendungen ignoriert?

Ich frage dies, weil auf "traditionellen" x86 müssen Sie angeben, wie der Aufrufer oder Aufgerufener stapeln Variablen (und wie die Funktion selbst kann bestimmte CPU-Register etc.); aber soweit ich weiß, hat x64 nur eine einzige Konvention, __fastcall (die unlängst hinzugefügt __vectorcall ungeachtet).

Also geht die CLR einfach weiter und Marshall-Funktionsaufrufe mit der __fastcall x64 Konvention, unabhängig davon, was Sie für die CallingConvention Eigenschaft festlegen?

Antwort

9

Ja, vollständig ignoriert. Der 64-Bit-Pinvoke-Marshaller unterstützt nur die x64 ABI, basierend auf __fastcall. Sehr locker. Wenn Sie CallingConvention angeben, erhalten Sie keine Ausnahme.

Beachten Sie, dass __vectorcall nicht für x64 spezifisch ist, es gibt auch eine x86-Variante. Keiner wird vom pinvoke marshaller unterstützt, Sie müssten einen C++/CLI-Wrapper schreiben. Es wäre sehr wenig sinnvoll, es zu unterstützen, .NET Jitter haben immer noch sehr schwache SSE2/AVX-Unterstützung. Ein kleines bisschen in System.Numerics.Vector mit dem RyuJIT-Jitter, dem neuen x64-Jitter, der mit VS2015 ausgeliefert wurde, aber noch nicht in der Lage war, Argumente an eine Methode zu übergeben. Die harsche Ausrichtungsanforderung erfordert eine sehr drastische CLR-Neufassung, Fernmusik der Zukunft.