P/Invoke Declaration não parece correto
-
27-09-2019 - |
Pergunta
Fui entregue a uma biblioteca que foi desenvolvida em casa como invólucro para bits. Disseram -me que, se você quisesse mudar entre a compilação de 64 bits e 32 bits, precisaria trocar essas duas linhas comentadas.
[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;
//}
Isso simplesmente não está bem comigo, foi a pessoa que eu consegui ao fazer a coisa certa (esse código é implantado em máquinas 32 e 64 usando o truque de comentário trocado, então eu sei que funciona). Se é isso que precisa ser feito, é alguma maneira de fazê -lo, para que o comentário não precise ser ajustado manualmente toda vez que uma construção de 32 ou 64 bits é feita? (ou uma maneira de tornar este DLL alvo da CPU tudo compatível)
Solução
Você não precisa fazer truques x64/x86, aqui está o pinvoke da estrutura
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct BG_BASIC_CREDENTIALS
{
public string UserName;
public string Pssword;
}