2010-10-04 3 views
2

J'ai reçu une bibliothèque qui a été développée en interne comme emballage pour BITS. On m'a dit que si vous vouliez passer de la version 64 bits à la version 32 bits, vous auriez besoin d'échanger ces deux lignes commentées.La déclaration P/Invoke ne semble pas correcte

[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; 
//} 

Ce juste ne siège pas bien avec moi, était la personne que je suis arrivé ce de faire la bonne chose (ce code est déployé sur 32 et 64 machines en utilisant l'astuce de commentaire troqué donc je sais que cela fonctionne) . Si c'est ce qui doit être fait, y a-t-il un moyen de le faire pour que le commentaire n'ait pas besoin d'être ajusté manuellement à chaque fois qu'une construction de 32 ou 64 bits est faite? (Ou un moyen de faire ce cpu cible dll tous compatibles)

Link to the MSDN of the datatype

+0

J'ai aussi ajouté cela à [pinvoke.net] (http: //pinvoke.net/default.aspx/Structures/BG_BASIC_CREDENTIALS.html |) –

Répondre

4

Vous n'avez pas besoin todo des astuces x64/x86, voici le PInvoke du struct

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

Yup, ça va le faire. Même le Pack non standard n'est pas nécessaire. –

Questions connexes