Копирование строки в байтовый буфер фиксированной длины в структуре - PullRequest
1 голос
/ 25 июня 2010

с учетом этой структуры в c #:

[StructLayout(LayoutKind.Sequential)]
unsafe public struct AppVPEntry
{
    public int Num;
    public fixed byte CompName[256];
    public int VPBeginAddress;
}

Какой самый простой способ скопировать строку ("c: \ path \ file.txt") в буфер фиксированной длины CompName.Это структура, которая отправляется в архаичную DLL, и у нас нет другого выбора, кроме как использовать.В идеале я бы хотел использовать функцию .NET, но поскольку она исправлена, что подразумевает «небезопасность», я знаю, что я ограничен здесь.Помогла бы более общая функция, поскольку у нас есть такие строки во всем пространстве импорта DLL.

Ответы [ 2 ]

1 голос
/ 25 июня 2010
// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
    System.Text.ASCIIEncoding  encoding = new System.Text.ASCIIEncoding();
    return encoding.GetBytes(str);
}

Возможно, вы захотите проверить, не превышает ли размер строки размер буфера.

0 голосов
/ 25 июня 2010

Попробуйте это.Используйте IntPtr в вашем DllImport везде, где вы можете передать VPEntry.Передайте "неуправляемое" поле везде, где вы вызываете свой метод DLL.

public sealed class AppVPEntry : IDisposable {

    [StructLayout(LayoutKind.Sequential, Size = 264)]
    internal struct _AppVPEntry {
        [MarshalAs(UnmanagedType.I4)]
        public Int32 Num;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public Byte[] CompName;
        [MarshalAs(UnmanagedType.I4)]
        public Int32 VPBeginAddress;
    }

    private readonly IntPtr unmanaged;
    private readonly _AppVPEntry managed = new _AppVPEntry();

    public AppVPEntry(Int32 num, String path, Int32 beginAddress) {
        this.managed.Num = num;
        this.managed.CompName = new byte[256];
        Buffer.BlockCopy(Encoding.ASCII.GetBytes(path), 0, this.managed.CompName, 0, Math.Min(path.Length, 256));
        this.managed.VPBeginAddress = beginAddress;
        this.unmanaged = Marshal.AllocHGlobal(264);
        Marshal.StructureToPtr(this.managed, this.unmanaged, false);
    }

    public void Dispose() {
        Marshal.FreeHGlobal(this.unmanaged);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...