2010-10-04 3 views
2

Мне была вручена библиотека, которая была разработана в доме в качестве обертки для BITS. Мне сказали, что если вы хотите изменить между 64-битной и 32-битной строкой, вам нужно будет поменять эти две строки с комментариями.Объявление P/Invoke кажется неправильным

[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-битная сборка? (Или способ, чтобы сделать эту цель длл процессор все совместимые)

Link to the MSDN of the datatype

+0

Я также добавил это [pinvoke.net] (http: //pinvoke.net/default.aspx/Structures/BG_BASIC_CREDENTIALS.html |) –

ответ

4

Вам не нужно TODO любых x64/x86 уловок, вот PInvoke из структуры

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

Yup, это сделает это. Даже нестандартный пакет не нужен. –