Ändern der Aufrufkonvention eines C # -Delegaten in CDECL

Ich hatte dieses Problem mit C #, als ich DotNet1.1 verwendete

Das Problem ist das. Ich habe eine unmanaged DLL, die eine function hat, die einen functionszeiger (neben anderen Argumenten) nimmt. Wenn ich den DLLImport in C # -Code deklariere, übergebe ich einen Delegaten. Die Delegaten in C # haben jedoch einen Aufruf von stdcall , während die nicht verwaltete function einen cdecl functionszeiger erwartet. So führte mein naives Vorgehen zu Abstürzen. Dann habe ich folgendes gefunden: http://www.codeproject.com/KB/cs/cdeclcallback.aspx Irgendein Typ hat eine ausgezeichnete Bibliothek geschrieben, die es ermöglicht, die Aufrufkonvention des Delegierten zu ändern, wie ich es verstanden habe, MSIL-hacking. Es ging gut, bis …

Ich habe auf VS2008 und die neue Version von .NET migriert. Unter dieser Version funktioniert die oben genannte Bibliothek nicht. Ich bin nicht wirklich ein C # – oder .NET-Experte, und um ehrlich zu sein, ich verstehe kaum, was seine Bibliothek tut (obwohl es Open-Source ist), also möchte ich nicht einmal versuchen, es an neues .NET anzupassen. Ich hoffe jedoch, dass eine neuere Version von C # eine bessere Lösung für mein Problem bietet.

Also, SO Experten, bitte hilf mir mit meinen Schmerzen im Gesäß 🙂

Standardmäßig umschließt das p / invoke-System Ihren Delegaten in einer stdcall-function. Sie können die Aufrufkonvention des generierten Wrappers ändern, indem Sie das UnmanagedFunctionPointer Attribut verwenden:

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void MyDelegate();