Hallo zusammen,
ich möchte in C# eine Funktion aus einer C++ DLL aufrufen. Diese Funktion liefert mir einen Pointer auf Äußere Struktur zurück. Diese Äußere Struktur enthält wiederum ein Array bzw. Pointer auf eine Innere Struktur.
Meine Frage ist nun, wie kann ich die Daten des Array of Structs aus dem Unmanaged Bereich in ein Array of Struct in den Managed Bereich kopieren.
Folgend ist die Realisierung der Strukturen, sowie der Realisierte Aufruf der C++ Funktion und ein Lösungsvorschlag zum kopieren der Daten:
C#-Code: |
[StructLayout(LayoutKind.Sequential)]
private struct Innere
{
public IntPtr data;
public int size;
}
[StructLayout(LayoutKind.Sequential)]
rivate struct Aeusere
{
public Int32 iValue1;
public Int32 iValue2;
public double dValue;
};
[DllImport(DLLPfad, CallingConvention = CallingConvention.Cdecl)]
private static extern void getData(IntPtr Data);
main()
{
IntPtr pAeusere;
getData(pAeusere);
Aeusere aeusere = (Aeusere) Marshal.PtrToStructure(pAeusere, typeof(emxArray));
Innere[] innere = new Innere[aeusere.size];
for (int i = 0; i < aeusere.size; i++)
{
IntPtr pElement = new IntPtr(aeusere.data.ToInt32() + Marshal.SizeOf(typeof(Innere)) * i);
Innere element = (Innere) Marshal.PtrToStructure(pElement, typeof(Innere));
innere[i] = element;
}
}
|
Strukturen und Funktion in C++:
Code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
struct Innere
{
int iValue1;
int iValue2;
double dValue;
};
struct aeusere
{
Innere *data;
int size;
// Weitere Felder
};
DLL_EXPORT void getData(Aeusere* pAeusere)
{
//Allokiere Speicherplatz für aeusere und Befülle aeusere
} |
|
Beim bisherigen Versuch kann ich Problemlos die Außere Struktur auf meine C# Variable kopieren. Ebenso kann ich die Daten der Inneren Struktur auf meine Variable element kopieren.
(Im Überwachungsfenster beim Debuging werden mir die richtigen Werte innerhalb der Variablen element angezeigt.)
Erst bei der Zuweisung der Element Variable an das Array (innere) (im Code markiert) tritt eine mit folgendem Wortlaut Exception auf:
"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
Ich verstehe jedoch nicht wieso die Variable element nicht zugewiesen werden kann? Im Überwachungsfenster ist sie ja schließlich befüllt und nicht "null".
Hatte jemand schon ein solches Problem oder kann jemand einen Fehler in meinem Programm feststellen?