Как я должен объявить эту структуру C для interop?

Возможно, хранение номера телефона разделяет в различных столбцах, допуская пустые или пустые записи?

6
задан Ricardo Nolde 12 November 2009 в 23:34
поделиться

2 ответа

В итоге я использовал массив байтов в качестве представления структуры и использовал построитель для установки значений. Прирост в производительности небольшой, но он есть. И есть преимущества памяти, так как я могу закрепить ее в памяти и отправить прямо в неуправляемую процедуру. На самом деле это помогает мне с другой проблемой: эта структура имеет две версии с разными xumrdadosc10000 размерами ... исходная - 10000 байт, но новая - 200000 байт, но имя то же самое для совместимости целей. Итак, я могу создать нужный размер в конструкторе, и вперед.

/// <summary>Builds PXUCAMR/PXUCAMRV3 as a byte array.</summary>
internal class PxucamrBuilder
{
    internal byte[] Pxucamr;

    /// <summary>Get/set field xumrversaocomc01, offset 0, size 1 byte.</summary>
    internal string StructureVersion
    {
        get { return Encoding.ASCII.GetString(this.Pxucamr, 0, 1); }
        set { Encoding.ASCII.GetBytes(value, 0, 1, this.Pxucamr, 0); }
    }

    /// <summary>Get/set field xumrambientec01, offset 12, size 1 byte.</summary>
    internal string Context
    {
        get { return Encoding.ASCII.GetString(this.Pxucamr, 12, 1); }
        set { Encoding.ASCII.GetBytes(value, 0, 1, this.Pxucamr, 12); }
    }

    /// <summary>Get/set field xumrcodfalhac05, offset 5, size 5 byte.</summary>
    internal string ErrorCode
    {
        get { return Encoding.ASCII.GetString(this.Pxucamr, 5, 5); }
        set { Encoding.ASCII.GetBytes(value, 0, 5, this.Pxucamr, 5); }
    }

    /// <summary>Get/set field xumridservidorc30, offset 130, size 30 bytes.</summary>
    internal string ServerId
    {
        get { return Encoding.ASCII.GetString(this.Pxucamr, 130, 30); }
        set { Encoding.ASCII.GetBytes(value, 0, value.Length, this.Pxucamr, 130); }
    }

    /// <summary>Get/set field xumrtamdadosb31, offset 24, size 4 byte.</summary>
    internal int DataSize
    {
        get
        {
            byte[] bytes = new byte[4];
            Array.Copy(this.Pxucamr, 24, bytes, 0, 4);
            return this.ByteArrayToInt32(bytes);
        }
        set
        {
            byte[] bytes = this.Int32ToByteArray(value);
            Array.Copy(bytes, 0, this.Pxucamr, 24, 4);
        }
    }

    /* ... same pattern to remaining fields ... */   
}

Смещения можно легко найти с помощью метода Marshal.OffsetOf .

Поскольку я использую этот, я отмечу этот ответ как правильный. Но я могу изменить это, если появится лучший ответ. Я все еще готов пробовать новые идеи!

5
ответ дан 17 December 2019 в 02:30
поделиться

When you tried with "strings to no avail" what happened? It crashed? Didn't map properly? Missed some fields?

I've used the following constructs in the past...

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct PXUCAMR
{
    [MarshalAs(UnmanagedType.I1)]
    public sbyte xumrversaocomc01;

    // null terminated string?
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
    public string xumrcodfalhac05;

    // or just raw data?
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)]
    public sbyte[] xumrcodfalhac05;
}

The CharSet.Ansi is needed for the ByValTStr setting. If xumrcodfalhac05 is really data and not a string, use the sbyte array.

1
ответ дан 17 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: