【问题标题】:P/Invoke declaration does not seem correctP/Invoke 声明似乎不正确
【发布时间】:2011-04-20 22:28:40
【问题描述】:

我收到了一个内部开发的库,作为 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全部兼容的方法)

Link to the MSDN of the datatype

【问题讨论】:

标签: c# pinvoke microsoft-bits bits-service


【解决方案1】:

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

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct BG_BASIC_CREDENTIALS
{
  public string UserName;
  public string Pssword;
}

【讨论】:

  • 是的,就可以了。即使是非标准的Pack也是不必要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多