Peter schrieb:
> entity schrieb:
>> byte[,] Data_out = new byte[32, 32];
>
> klar kann man es so anlegen, aber ich bin mir nicht sicher wie die Daten
> im Speicher angeordnet sind. Data_out ist ein .NET ein Object mit
> eigenschaften ( z.b. anzahl der elemente) und das heist es müssen
> irgendwo noch objektdaten existieren die zusätzlich zu den Nutzdaten
> vorhanden sind. Und das ist das Problem, in C gibt es sotwas nicht.
Es ist doch (fast) völlig unerheblich, wie .net die Objekte ablegt.
Wichtig ist, dass die unmanaged-Funktion in der Dll die Daten im
richtigen Format erhält. Dafür ist P/Invoke mit seinen
Marshalling-Funktionen da. Das führt die entsprechenden Konvertierungen
durch.
FuchsS schrieb:
> Ich habe eine dll Datei deren Funktionen ich in C# verwenden möchte,
> soweit funktioniert das auch schon. Jedoch gibt es eine Funktion die
> einen Doppelzeiger auf ein zweidimensionales Array erwartet.
Mir scheint, Du siehst vor lauter Bäumen (Doppelzeiger) nicht den Wald
(was macht die Funktion). Einen Doppelzeiger verwendet man in C bei den
Funktionsparametern z.B. dann, wenn in der Funktion ein Speicherbereich
neu allokiert werden soll (Ich entschuldige mich bereits an dieser
Stelle für meine ggf. unpräzise Formulierung aus sicht eines C-Gurus,
meine Kenntnisse sind seit über 10 Jahren etwas eingerostet). Anders
formuliert: Die Funktion soll einen Zeiger auf einen Speicherbereich
ändern und aus irgend welchen Gründen wird dafür nicht der
Funktions-Rückgabewert sondern ein Funktionsparameter verwendet. Für
sowas gibt es in C# "out" und "ref":
1 | [DllImport...]
|
2 | private static int MyUnmanagedFunction( out byte[] pointerPointer );
|
Die andere Frage ist natürlich, wie das zweidimensionale Array
organisiert ist, das aus der Funktion herauskommt. Ich würde ggf. in C#
ein eindimensionales Array verwenden und dessen Inhalt dann in ein
passendes zweidimensionales C#-Array umkopieren (sofern es sich nicht um
Datenmengen im Gigabyte-Bereich handelt). Was auch noch zu prüfen wäre:
Die Speicherverwaltung. Du hast hier einen Übergang zwischen unmanaged
und managed C#. Wenn die Dll-Funktionen erwarten, dass der allokierte
Speicher ausserhalb freigegeben wird (ist das zwar ziemlicher Müll), Du
musst es aber dann irgendwie selbst handeln.
Gruß
Markus