C# P/Invoke声明似乎不正确

C# P/Invoke声明似乎不正确,c#,pinvoke,microsoft-bits,bits-service,C#,Pinvoke,Microsoft Bits,Bits Service,我被传下了一个图书馆,这个图书馆是在家里开发的,作为比特的包装。我被告知,如果您想在64位和32位构建之间进行更改,则需要交换这两行注释 [StructLayout(LayoutKind.Explicit, Size = 8, Pack = 4)] //32 bit address internal struct BG_BASIC_CREDENTIALS { [FieldOffset(0)] [MarshalAs(UnmanagedType.LPWStr)] publi

我被传下了一个图书馆,这个图书馆是在家里开发的,作为比特的包装。我被告知,如果您想在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完全兼容的方法)


您不需要做任何x64/x86技巧,下面是结构的pinvoke

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

是的,那就行了。即使是非标准的包装也是不必要的。我还将此添加到了