Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
2Dim Array nach unmanaged DLL SafeArray
John444
myCSharp.de - Member



Dabei seit:
Beiträge: 42

Themenstarter:

2Dim Array nach unmanaged DLL SafeArray

beantworten | zitieren | melden

Hallo...

ich habe eine externe DLL (kleines C++ Programm (Unmanaged) ) in meinem C# Projekt integriert.
Klappt auch soweit ganz gut, jetzt das Problem.

Wie übergebe ich ein 2 Dimensionales double Array (double[][] tmp) an die DLL Funktion.

Ich bekomme folgende Exception:
System.Runtime.InteropServices.MarshalDirectiveException

Additional information: Can not marshal parameter #3: Invalid managed/unmanaged type combination (Arrays can only be marshaled as Array or SafeArray).

Jetzt zur Frage:
Wie erstelle ich ein SafeArray in C#, wie ich es in C++ wieder auslese müsste ich eigentlich hinbekommen.

Schon mal danke für die mühen.
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8775
Herkunft: Berlin

beantworten | zitieren | melden

Zweidimensionale Felder werden nicht durch das Marshalling unterstützt. Im Speicher wird aber ein zweidimensionales Feld als eindimensionales Feld ablegegt (n*m). Genauso musst du es auch übergeben (MarshallAs.LpArray mit SizeConst = m*n).
private Nachricht | Beiträge des Benutzers
John444
myCSharp.de - Member



Dabei seit:
Beiträge: 42

Themenstarter:

beantworten | zitieren | melden

schon mal danke für die schnelle antwort.

hab jetzt alles in nem 1D Feld drin.

Wie bekomme ich jetzt genau das 1D Feld an die DLL geschickt.


so sieht die dll funktion aus:


[DllImport("mydll.dll")]
static extern int avSendData(int rows,int cols,double[] data);


so meine funktion


int ret = avSendData(rows,cols,1DFeld);


was muss ich da jetzt genau mit der Marshal Funktion machen?
Ein MarshallAs.LpArray gibt es bei mir nicht?
nur, Marshal, MarshalAsAttribute, MarshalBy..., usw. keine hat eine LpArray Methode

Danke
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8775
Herkunft: Berlin

beantworten | zitieren | melden

Für ein 3x3-Feld müßte das so gehen:

 
[DllImport("mydll.dll")]
static extern int avSendData(int rows,int cols,[MarshalAs(UnmanagedType.LPArray, SizeConst=9)] double[] data);
private Nachricht | Beiträge des Benutzers
John444
myCSharp.de - Member



Dabei seit:
Beiträge: 42

Themenstarter:

beantworten | zitieren | melden

werde das am Mo. mal versuchen.


Danke für die Hilfe
private Nachricht | Beiträge des Benutzers