P / Invoke声明似乎不正确

时间:2010-10-04 17:35:17

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

我传下了一个在内部开发的库,作为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

1 个答案:

答案 0 :(得分:4)

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

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