在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导入空间中都有这样的字符串。
答案 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);
}
}