C#Struct No无参数构造函数?看看我需要完成什么

14 c# dll constructor struct dllimport

我使用结构传递给非托管DLL,因为 -

[StructLayout(LayoutKind.Sequential)]
        public struct valTable
        {
            public byte type;
            public byte map;
            public byte spare1;
            public byte spare2;
            public int par;
            public int min;
            public byte[] name;
            public valTable()
            {
                name = new byte[24];
            }
        }
Run Code Online (Sandbox Code Playgroud)

上面的代码将无法编译,因为VS 2005会抱怨"Structs不能包含显式无参数构造函数".为了将这个结构传递给我的DLL,我必须像这样传递一个struct数组valTable[] val = new valTable[281];

我想说的是,当我说new,构造函数被调用并且它创建了一个像我试图演示的字节数组,因为DLL正在寻找每个维度中大小为24的字节数组.

我怎么能做到这一点?

Jon*_*eet 20

您可以使用固定大小的缓冲区 - 我怀疑您确实想要它,以便在结构中获取"内联"数据(而不是在其他地方引用数组).

public fixed byte name[24];
Run Code Online (Sandbox Code Playgroud)

你需要将结构声明为不安全的.

请注意,任何需要调用静态方法或提供任何类型的自定义构造函数的"解决方案"都将失败,您的明确目标是能够创建这些结构的数组.

  • @Jeffrey:小心一点.这很容易弄错.有关这方面的一些想法,请参见http://blogs.msdn.com/ericlippert/archive/2009/08/27/what-s-the-difference-between-fixed-and-fixed.aspx.坦率地说,很多时候我可能会使用你的九整数解决方案.:-) (2认同)

And*_*rey 6

我建议写这段代码.

[StructLayout(LayoutKind.Sequential)]
public struct valTable
{
    public byte type;
    public byte map;
    public byte spare1;
    public byte spare2;
    public int par;
    public int min;
    public byte[] name;

    static public valTable Create()
    {
        valTable vT = new valTable();
        vT.name = new byte[24];
        return vT;
    }
}
Run Code Online (Sandbox Code Playgroud)