Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mo 28.06.10 10:02 
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):
ausblenden 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);

ausblenden 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
Einloggen, um Attachments anzusehen!
_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 28.06.10 12:59 
msdn.microsoft.com/e...ibrary/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: .

_________________
>λ=

Für diesen Beitrag haben gedankt: Christian S.
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".