Проблема взаимодействия - различная структура C # для разных архитектур ОС - PullRequest
1 голос
/ 08 мая 2009

У меня есть структура C ++, и я должен взаимодействовать с ней из моего кода C #.

Я компилирую свой код C # как независимую от платформы dll, что означает, что я могу использовать одну и ту же C # dll на разных платформах ( 32-битная или 64-битная - не имеет значения ), тогда как я распространяю C ++ по-разному для разных платформ.

Проблема в том, что структура C ++, которую я должен взаимодействовать, похоже, работает для другого определения C #. В 64-битной ОС работает следующая структура:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MayDay_CONTEXT
    {
        public System.UInt32  dwIndex;      //previously was int
        public System.UInt32 dwVersion;     //previously was int        
        public System.UInt64 hLock;         //previously was int
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
        public byte[] reserve;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
        public byte[] bAtr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] bID;
        public uint dwAtrLen;
    } 

, но в 32-битной ОС работает следующая структура:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MayDay_CONTEXT
    {
        public int  dwIndex;        //previously was int
        public int dwVersion;       //previously was int        
        public int hLock;           //previously was int
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
        public byte[] reserve;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
        public byte[] bAtr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] bID;
        public uint dwAtrLen;
    }

Есть ли способ установить тип элемента структуры во время выполнения? Я знаю, что для этого нужна какая-то утка, но, может быть, есть лучшее решение ... есть идеи?

1 Ответ

2 голосов
/ 08 мая 2009

Будет ли IntPtr (для hLock) работать? В противном случае вам, вероятно, придется использовать определения #if в вашем источнике ... - т.е.

#if X86
     ..
#else
     ..
#endif

и определите символ X86 в ваших 32-битных сборках (ничего не встроено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...