将字符串复制到结构中的固定长度字节缓冲区

时间:2010-06-25 16:00:35

标签: c# string dll

在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 个答案:

答案 0 :(得分:1)

// 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);
}

您可能想检查字符串的大小是否不长于缓冲区的大小。

答案 1 :(得分:0)

试一试。在可能传递VPEntry的任何地方使用DllImport中的IntPtr。在您调用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);
    }
}