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

Was hat sich denn da im Framework geändert?
Grüße
Christian
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".