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)

Link para o msdn do tipo de dados

Foi útil?

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top