P / Invoke декларация не кажется правильной - PullRequest
2 голосов
/ 04 октября 2010

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

4 голосов
/ 04 октября 2010

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

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