0

我有一个 dll 包含一个函数,该函数返回一个带字节的结构和一个 7 个双精度数组:

public struct myStruct
{
    public byte v1;     
public Blob v2;
}

dll函数:

[DllImport("myDLL", EntryPoint = "?myDLLFuntion@@YA?AUmyStruct@@XZ", ExactSpelling = true)]
public static extern MyStruct myDLLFunction();

这是我的斑点:

[StructLayout(LayoutKind.Sequential, Size = ((sizeof(double))*7))]
public struct Blob
{
// Intentionally left empty. It's just a blob
}

我创建了一个函数来获取数组:

public double[] GetArray(Blob NameBlob)
{

    IntPtr dPtr = IntPtr.Zero;  
    try
    {
        dPtr = Marshal.AllocHGlobal(((sizeof(double))*7));
        Marshal.StructureToPtr(NameBlob, dPtr, false);
        double[] r = new double[((sizeof(double))*7)];

        Marshal.Copy(dPtr, r, 0, ((sizeof(double))*7));

        return r;
    }
    finally
    {
        if (dPtr != IntPtr.Zero) 
        {
            Marshal.FreeHGlobal(dPtr);
        }
    }
}

我这样称呼它:

myStruct s1=myDLLFunction();

GetArray(s1.v2)[0]; // print it

我得到了错误的值,如果有人可以帮助我,那就太好了,我说的是 Marshal 的使用......我认为我做错了。

4

1 回答 1

1

正如 Hans Passant 指出的那样,StructureToPtr()当结构没有任何字段时,什么都不做。我想我们在谈论这个:

[StructLayout(LayoutKind.Sequential)]
public struct Blob
{
    [MarshalAs (UnmanagedType.ByValArray, SizeConst = 7)]
    double[] array;
}
于 2012-12-25T20:16:34.157 回答