在C#中使用2D数组包装器的最佳方法

时间:2016-07-28 21:22:23

标签: c# c arrays

开始的一个小背景:我们的软件涉及一个用C#包装的C计算引擎,然后是一个C#WPF GUI。我们在C中有结构,然后在C#中使用它们的对象版本。

我遇到的一个问题是C中的一个结构定义如下:

struct mailbox
{
    char  string[15][256];
    float number[500];
}

我们有很多带有数组的结构,这些都很好,但是2D char数组让我感到沮丧。我们通常的做法是使用匹配的C#结构定义,然后使用一个对象来获取它并使用属性包装字段,以及许多其他功能。我目前实现这一目标的方法是制作两个结构:

[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct Character256String
{

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
    private char[] __value;

    public string Value
    {
        get
        {
            return new string(__value);
        }
        set
        {
            this.__value = (EngineUtils.FillOrTruncate(value, 256)).ToCharArray();
        }
    }

    public static implicit operator string(Character256String source)
    {
        return source.Value;
    }

    public static implicit operator Character256String(string source)
    {
        return new Character256String
        {
            Value = source
        };
    }

    public override string ToString()
    {
        return new string(__value).ToString();
    }
}

public struct MailboxStruct
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = Mailbox.MailboxMaxStrings)]
    public Character256String[] strings;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = Mailbox.MailboxMaxNumbers)]
    public Single[] numbers;

}

最后,实际的Mailbox C#对象具有MailboxStruct的实例以及包含结构版本的StringsNumbers的属性。一切都在工作,我遇到的问题是,如果我将对象的Strings属性设为Character256String[],那么它可以保留值,但看起来很丑,并且不是标准类型。如果我改为string[]并且基本上从get string[]中的Character256String[]创建Mailbox,那么如果你在数组中设置一个值,那么它将不会持续存在,因为这不是' t连接到数组的原始实例。

长话短说,在Mailbox mailbox = Magic.GetMailbox(); // Gets the value from the C mailbox.Strings[0] = "This is a test"; mailbox.Save(); // persists the value back to the C 对象中,我希望能够像这样执行代码:

Mailbox.Strings

我无法想出一个让string[]成为int的好方法,但仍然坚持这些值。是什么让这变得复杂,以及为什么这不是2D If OnetimeOption.Value = True Then Select Case MonthComboBox.Value Case "Week One" iCol = "C" Case "Week Two" iCol = "N" Case "Week Three" iCol = "O" Case "Week 4" iCol = "P" Case "Week 5", "Week 6", "One Month" iCol = "Q" End Select Else nExtend = 1 'Set this as a default. Select Case MonthComboBox.Value Case "Week One" iCol = "C" Case "Week One" iCol = "N" nExtend = 4 Case "Current Month +2" iCol = "O" nExtend = 3 Case "Current Month +3" iCol = "P" nExtend = 2 Case "Current Month +4" iCol = "Q" End Select End If 数组的问题,例如,我从C获取char数组并且必须包装它们以使它们成为字符串。这实际上是必要的,因为我们的C“字符串”都是固定长度的char数组,因此我们需要在设置它们时填充或截断它们。

希望这很清楚......对于班级名称感到抱歉。我删除了产品识别名称,并留下了一些非常蹩脚的结果。

0 个答案:

没有答案