开始的一个小背景:我们的软件涉及一个用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
的实例以及包含结构版本的Strings
和Numbers
的属性。一切都在工作,我遇到的问题是,如果我将对象的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数组,因此我们需要在设置它们时填充或截断它们。
希望这很清楚......对于班级名称感到抱歉。我删除了产品识别名称,并留下了一些非常蹩脚的结果。