导入VB6结构到C#(Import a VB6 structure into C#)

2019-09-23 00:23发布

我一直在负责一些旧代码转换到新系统,我们已经得到了在这里一些VB6结构。 有没有办法将它们转换成C#结构容易吗?

我可以重新定义在C#中的结构,但有一个在C#中没有固定的字符串。 (或者,也许我误会)

在正确的方向上没有任何电棒?

Private Type MapRec
    Name As String * NAME_LENGTH
    Revision As Long
    Moral As Byte
    Up As Integer
    Down As Integer
    Left As Integer
    Right As Integer
    Music As String
    BootMap As Integer
    BootX As Byte
    BootY As Byte
    Tile() As TileRec
    Npc(1 To MAX_MAP_NPCS) As Integer
    NpcSpawn(1 To MAX_MAP_NPCS) As SpawnRec
    TileSet As Integer
    Region As Byte
End Type

Answer 1:

相对于固定长度字符串,让人惊讶。 这是不会发生的,因为没有等价结构。 除非乔恩斯基特或安德斯·海尔斯伯格认识不同,可以被调用来权衡 - 我不认为即使他们知道的方式辩论,因为没有一个,我很肯定。

在另一方面,固定长度的字符串是绝对的魔鬼。 这就是为什么他们不包括他们在.NET。 :-)

如果你问我, 会怎么以上MapRec对象转换为C#中可用的东西,那么你那种有一个结构和类之间的选择。 就个人而言,我不喜欢结构。 如果您使用的类,那么你可以通过你的getter和setter方法的方式实现一种bastardized固定字符串。 由于在这个例子中看到的,这是我将如何实现你的类型MapRec:

public class MapRec
{
    private const int MAX_MAP_NPCS = 25;
    private int fixedLength1 = 10;
    private string _name;

    public string Name
    {
        get
        {
            return _name;
        }
        set
        {
            if (value.Length != fixedLength1)
            {
                if (value.Length < fixedLength1)
                {
                    _name = value.PadRight(fixedLength1);
                }
                else
                {
                    _name = value.Substring(0,fixedLength1);
                    // or alternatively throw an exception if 
                    // a 11+ length string comes in
                }
            }
            else
            {
                _name = value;
            }
        }
    }

    // Constructor
    public MapRec()
    {
        Npc = new int[MAX_MAP_NPCS];
        NpcSpawn = new SpawnRec[MAX_MAP_NPCS];
    }

    public long Revision { get; set; }
    public byte Moral { get; set; }
    public int Up { get; set; }
    public int Down { get; set; }
    public int Left { get; set; }
    public int Right { get; set; }
    public string Music { get; set; }
    public int BootMap { get; set; }
    public byte BootX { get; set; }
    public byte BootY { get; set; }
    public TileRec[] Tile { get; set; }
    public int[] Npc { get; set; }
    public SpawnRec[] NpcSpawn { get; set; }
    public int TileSet { get; set; }
    public byte Region { get; set; }
}

最后,除非确实需要一个固定长度的字符串(也许Microsoft.VisualBasic.VBFixedStringAttribute可以做的工作),我建议住的挫折感离开他们。



Answer 2:

你可能有兴趣在VBFixedStringAttribute和VBFixedArrayAttribute ,虽然它们在一些地方只是利用。

又见这个问题,并且这个问题 。



文章来源: Import a VB6 structure into C#