P/Invoke декларация не кажется правильной

Мне передали библиотеку, которая была разработана в доме как обертка для битов. Мне сказали, что если вы хотите переключиться между 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 полностью совместимой)

Ссылка на MSDN типа данных

1 ответ

Решение

Вам не нужно делать какие-либо трюки x64/x86, вот пинвока структуры

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct BG_BASIC_CREDENTIALS
{
  public string UserName;
  public string Pssword;
}
Другие вопросы по тегам