我想编组一个带有可变长度数组的C结构回C#但到目前为止,我不能得到比指针结构表示和指针更好的东西浮。编组包含一个可变长度数组的C结构
非托管表示:
typedef float smpl_t;
typedef struct {
uint_t length; /**< length of buffer */
smpl_t *data; /**< data vector of length ::fvec_t.length */
} fvec_t;
托管表示:
[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);
我想什么是有一个.NET风格数组,其中data
将float[]
但如果我不改变结构来下面的表格确实得到了在上面的外部函数中,无法获取受管理类型的地址,获取大小或声明指针。
[StructLayout(LayoutKind.Sequential)]
public unsafe struct fvec_t1
{
public uint length;
public float[] data;
}
Apparently,涉及一种具有编组背面的可变长度数组原来的样子,这是正确的或者是它还有一个方法来实现这一点是不可能的?
您可以轻松地将数组作为参数传递。任何你不这样做的理由?你为什么使用'unsafe'? –
你能详细说明一下吗?事情是当我指定MarshalAs.Struct调用的作品,但返回的结构是垃圾(长度不正确),所以我想它不能正常工作。所以现在,唯一的工作是返回一个struct指针并手动访问'data'中的项。关于不安全的声明,我只是忘了删除它。 – Aybe
你不能在一个结构体内部有数组,并让编组员完成这项工作。但是你可以将数组作为指针传递并编组。 –