Entwickler-Ecke

Basistechnologien - PInvoke funktioniert nicht für 4.0


Christian S. - Mo 28.06.10 10:02
Titel: PInvoke funktioniert nicht für 4.0
Hallo!

Ich möchte eine Funktion der FFTW-Lib aus C# ansteuern. Das hatte ich vor einiger Zeit schonmal in Prism gelöst und wollte den Code nun nach C# portieren. Sollte ja eigentlich kein Problem sein, ist es aber ;-)

Dies (dll, 28 KB) ist die DLL, die Prism ausspuckt und dies (dll, 11.5 KB) die neue DLL, welche von C# ausgespuckt wird. Die Methode, um die es geht, ist die FFTW.DFT1D, welche jeweils die "fftw_plan_dft_1d"-Methode aus der FFTW-Lib (dll, 1.33 MB) aufruft.

In der Prism-Variante funktioniert das, in der C#-Variante bekomme ich folgende Fehlermeldung:
Zitat:
PInvokeStackImbalance wurde erkannt.
Message: Ein Aufruf an die PInvoke-Funktion "CSLib!CSLib.FFTW::DFT1D" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.


Wenn ich mir die DLLs im Reflector ansehe, sehen die für mich absolut identisch aus, auch die Signatur im Quelltext ist identisch (bis auf den Namen, der ja aber egal ist):

C#-Variante
1:
2:
        [DllImport(libFile, EntryPoint = "fftw_plan_dft_1d", ExactSpelling=true)]
        public static extern IntPtr DFT1D(int n, IntPtr input, IntPtr output, FFTW_Direction direction, FFTW_Flags flags);


Prism-Variante
1:
2:
  [DllImport("libfftw3-3.dll", EntryPoint := "fftw_plan_dft_1d", ExactSpelling := true)]
    class method dft_1d(n : Integer; input, output : IntPtr; direction : FFTW_Direction; &flags : FFTW_Flags) : IntPtr; external;


Nun kompilierte ich die C#-Version für .NET 4.0, die Prism-Version für 2.0. Kompiliere ich die C#-Version für 2.0, geht es plötzlich :shock: Was hat sich denn da im Framework geändert? :gruebel:

Grüße
Christian


Kha - Mo 28.06.10 12:59

http://msdn.microsoft.com/en-us/library/0htdy0k3.aspx hat folgendes geschrieben:
In the .NET Framework version 3.5, the pInvokeStackImbalance MDA is disabled by default.
:D

Frag mich aber bitte nicht, ob deine Übersetzung falsch ist oder die DLL etwas verbockt :gruebel: .


Christian S. - Mo 28.06.10 16:59

Okay, der "Fehler", wenn es denn einer ist, wurde bisher also nur nicht bemerkt.

Ich bin mir meiner Methoden-Signatur sehr sicher, die Calling-Convention hatte ich auch schonmal explizit angegeben. Außerdem funktioniert der Aufruf auch problemlos, wenn dieses MDA-Dingens nicht rein funkt. Ich glaube, ich halte das mal für etwaige Probleme im Hinterkopf und vertraue ansonsten der FFTW, dass sie da schon alles richtig macht ;-)

Ich hab die eine Klasse jetzt erstmal in eine .NET-2.0-Assembly ausgelagert, damit ich nicht global die MDA-Exception abschalten muss, könnte ja doch mal sinnvoll sein ;-)