IntPtr в 32-битной ОС, UInt64 в 64-битной ОС - PullRequest
3 голосов
/ 17 мая 2010

Я пытаюсь сделать взаимодействие со структурой C ++ из C #. Структура (в оболочке C #) выглядит примерно так

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct SENSE4_CONTEXT
{
    public System.IntPtr dwIndex; //or UInt64, depending on platform.
}

Базовая структура C ++ немного ненормальна. В 32-битной ОС, dwIndex должно быть IntPtr, чтобы взаимодействие могло работать, но в 64-битной ОС оно должно быть UInt64, чтобы взаимодействие могло работать.

Есть идеи, как изменить вышеуказанную структуру, чтобы она работала как на 32-, так и на 64-битных ОС?

Ответы [ 3 ]

1 голос
/ 17 мая 2010

В 64-битном процессе значение IntPtr должно быть точно таким же, как и UInt64.
Убедитесь, что для вашей целевой платформы установлено значение «Любой процессор».

Чтобы рассматривать его как UInt64 в C #, вы можете написать

UInt64 value = (UInt64)s.dwIndex.ToInt64();

Если вам нужно запустить как 32-битный процесс, вам нужно объявить две разные версии struct и две разные перегрузки методов, которые его принимают, и выбрать одну из них, используя if заявление.

1 голос
/ 17 мая 2010

Если префикс "dw" в dwIndex является точным, то он звучит как DWORD, что является 32-разрядным беззнаковым целым числом. В этом случае вам нужно использовать UIntPtr, что будет похоже на UInt32 на 32-битной и как UInt64 на 64-битной.

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

0 голосов
/ 17 мая 2010

Вы можете использовать директиву компилятора / обнаружение платформы, а затем сделать общее typedef:

typedef indexType IntPtr

или

typedef indexType UInt64

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