Ich möchte eine C-Struktur mit einem Array variabler Länge zurück zu C# marshale aber bis jetzt kann ich nichts besseres als eine Zeiger-zu-Struktur-Darstellung und einen Zeiger bekommen schweben.Marshal eine C-Struktur mit einem Array variabler Länge
Unmanaged Darstellung:
typedef float smpl_t;
typedef struct {
uint_t length; /**< length of buffer */
smpl_t *data; /**< data vector of length ::fvec_t.length */
} fvec_t;
Managed Darstellung:
[StructLayout(LayoutKind.Sequential)]
public unsafe struct fvec_t1
{
public uint length;
public float* data;
}
[DllImport("libaubio-4.dll", EntryPoint = "new_fvec", PreserveSig = true, CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.Cdecl)]
public static extern unsafe fvec_t1* new_fvec1(uint length);
Was Ich mag würde, ist eine .NET-Stil-Array haben, wo data
float[]
sein würde, aber wenn ich ändern tun, um die Struktur zu das Formular unten bekomme ich Kann die Adresse nicht übernehmen, erhalten die Größe von, oder einen Zeiger auf einen verwalteten Typ in der externen Funktion oben deklarieren.
[StructLayout(LayoutKind.Sequential)]
public unsafe struct fvec_t1
{
public uint length;
public float[] data;
}
Apparently, ist es nicht möglich, eine einen variabler Länge Array vermarshallten zurück wie sie ist, dies richtig ist oder ist es immer noch eine Möglichkeit, dies zu erreichen?
Sie können es einfach genug tun, ein Array als Parameter übergeben. Irgendein Grund, warum Sie das nicht tun? Warum benutzt du 'unsicher '? –
Können Sie das näher erläutern? Die Sache ist, wenn ich MarshalAs.Struct den Anruf funktioniert, aber die zurückgegebene Struktur ist Müll (Länge ist falsch), so denke ich, es hat nicht richtig funktioniert. Im Moment ist das einzige, was funktioniert, einen Zeiger von struct zurückzugeben und manuell auf die Daten in 'data' zuzugreifen. Über unsichere Aussage, ich habe gerade vergessen, es zu entfernen. – Aybe
Sie können das Array nicht innerhalb einer Struktur haben und den Marshaller die Arbeit machen lassen. Aber Sie können das Array als Zeiger übergeben und es marshallen lassen. –