Laden...

2Dim Array nach unmanaged DLL SafeArray

Erstellt von John444 vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.555 Views
J
John444 Themenstarter:in
42 Beiträge seit 2005
vor 18 Jahren
2Dim Array nach unmanaged DLL SafeArray

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.

S
8.746 Beiträge seit 2005
vor 18 Jahren

Zweidimensionale Felder werden nicht durch das Marshalling unterstützt. Im Speicher wird aber ein zweidimensionales Feld als eindimensionales Feld ablegegt (nm). Genauso musst du es auch übergeben (MarshallAs.LpArray mit SizeConst = mn).

J
John444 Themenstarter:in
42 Beiträge seit 2005
vor 18 Jahren

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

S
8.746 Beiträge seit 2005
vor 18 Jahren

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);

J
John444 Themenstarter:in
42 Beiträge seit 2005
vor 18 Jahren

werde das am Mo. mal versuchen.

Danke für die Hilfe