سؤال

لقد تم تقديم مكتبة تم تطويرها في المنزل كركبة للبوت. قيل لي إنه إذا أردت التغيير بين البناء 64bit و 32bit ، فستحتاج إلى تبديل هذين الخطين المعلقين.

[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 من نوع البيانات

هل كانت مفيدة؟

المحلول

لا تحتاج إلى ToDo أي حيل X64/x86 ، إليك Pinvoke من البنية

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
struct BG_BASIC_CREDENTIALS
{
  public string UserName;
  public string Pssword;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top