2

我得到了一个内部开发的库,作为 BITS 的包装器。有人告诉我,如果您想在 64 位和 32 位版本之间进行更改,则需要交换这两条注释行。

[StructLayout(LayoutKind.Explicit, Size = 8, Pack = 4)]  //32 bit address
internal struct BG_BASIC_CREDENTIALS
{
    [FieldOffset(0)]
    [MarshalAs(UnmanagedType.LPWStr)]
    public string UserName;

    [FieldOffset(4)]
    [MarshalAs(UnmanagedType.LPWStr)]
    public string Password;
}


//[StructLayout(LayoutKind.Explicit, Size = 16, Pack = 8)]  //64 bit address
//internal struct BG_BASIC_CREDENTIALS
//{
//    [FieldOffset(0)]
//    [MarshalAs(UnmanagedType.LPWStr)]
//    public string UserName;

//    [FieldOffset(8)]
//    [MarshalAs(UnmanagedType.LPWStr)]
//    public string Password;
//}

这只是不适合我,是我从做正确的事情中得到这个的人(这段代码使用交换注释技巧部署在 32 和 64 机器上,所以我知道它有效)。如果这是需要做的,有什么方法可以做到,这样每次 32 位或 64 位构建完成时都不需要手动调整注释?(或使此 dll 目标 cpu 全部兼容的方法)

链接到数据类型的 MSDN

4

1 回答 1

4

你不需要做任何 x64/x86 技巧,这里是结构的 pinvoke

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct BG_BASIC_CREDENTIALS
{
  public string UserName;
  public string Pssword;
}
于 2010-10-04T17:44:58.630 回答