Hallo,
ich habe ein my.dll (Borland C++), wo er ein 2D int iTMJ [5][12] Array mit Daten zurückliefert:
extern "C" MP5 Berechne(int iM, int iJ);
struct MP5
{
int iTMJ[5][12];
};
MP5 iTMJ;
MP5 _export Berechne(int iM, int iJ)
{
ArrayFüllung...
return(iTMJ);
}
public struct MP5 { public static int[,] iFelder = new int[5, 12];}
MP5 iTMJ;
[DllImport("my.dll", EntryPoint = "Berechne", CallingConvention = System.Runtime.InteropServices.CallingConvention.C decl, CharSet = CharSet.Auto, SetLastError = true)]
public static extern MP5 Berechne(int iM, int iJ);
Am Ende rufe ich die im my.dll enthaltene Funktion auf und übergebe auch Daten:
iTMJ = Berechne(12, 2013);
Bei der letzten Zeile, wo ich die Funktion aufgerufen wird, stürzt er ab und die 2D Daten werden nicht dem C# iTMJ zugewiesen warum ?
MFG
ich würde mal grob sagen, dass das struct "MP5" nicht derselbe datentyp ist wie der den du zurück bekommst.
Tipp: speicher das ganze in ein object, setz ein Haltepunkt und schau die den Datentyp mal genauer an den du da zurück bekommst.
Edit:
Ich weiß jetz nich wie das in c++ is, aber schau dir mal den unterschied zwischen "Jagged Arrays" und "2D Arrays" an (Jagged[][];2D[,]).
Auf jeden Fall muss das static bei MP5 beim c# struct weg.
Probier mal:
public struct MP5 {
[MarshalAs(UnmanagedType.LPArray, SizeConst=5*12)]
public int[,] iFelder;
}
Oder ansonsten mal Default Marshaling for Arrays anschauen und probieren....
Ansonsten sollte auch so etwas in der Art funktionieren wenn ich mich nicht irre:
struct MP5{
public fixed int iFelder[5, 12];
}
Hallo,
bei dem Kollegen Pdelvo gibt ein Compilerfehler.
beim Kollegen Weismat gibt's kein Absturz aber die Daten werden nicht in dem int [,] kopiert.
MFG
Was sagt den der Compilerfehler? Kannst du dem Compilerfehler nicht entnehmen, wie du es richtig machst?
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Einmal kurz googeln und dann hättest du doch schon rausgefunden woran es liegt, und wie man es löst: Multidimensional Arrays in a struct in C#
struct MP5{
public fixed int iFelder[5, 12];
}
Compilerfehler:
nach 5 beim ",": Syntaxfehler. ']' erwartet.
beim 12: Bezeichner erwartet.
MFG
a) unsafe-Implementierungen gehen auch nur im unsafe-Context
b) mehrdimensional funktioniert bei fixed nicht. Dazu muss * verwendet werden (siehe auch Link von pdelvo)
c) Fehlermeldungen immer direkt posten [Hinweis] Wie poste ich richtig? Punkt 5
d) ein wenig mehr Eigeninitiative Default Marshaling for Arrays - gerade bei PInvoke + unsafe context solltest Du genau wissen, was Du tust und nicht "irgendwas" probieren
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
public struct TMP5
{
[MarshalAs(UnmanagedType.LPArray, SizeConst = 5 * 12)]
public int[,] iFelder;
}
TMP5 iTMJ = new TMP5();
[DllImport("my.dll", EntryPoint = "Berechne", CallingConvention = System.Runtime.InteropServices.CallingConvention.C decl, CharSet = CharSet.Auto, SetLastError = true)]
public static extern MP5 Berechne(int iM, int iJ);
iTMJ = Berechne(1, 2014);
Mit Marshaling kenne ich mich leider nicht aus.
MFG
Entschuldige, aber mit "gibt einen Compilerfehler", "er stürzt ab" und "kenne ich mich nicht aus" hast du leider bewiesen, dass du die geforderte Eigeninitiative nicht an den Tag legst und auch den schon erwähnten [Hinweis] Wie poste ich richtig? Punkt 5 und gefühlt auch Punkt 4 nicht beachtest.
Du hast genug Stichworte um dich gezielt auf die Suche einer Lösung zu machen.
Daher ist hier erstmal zu.