Проверьте, работает ли моя программа в 32-битном режиме на 64-битной машине, если работает в 64-битной - как заставить ее быть 32-битной - PullRequest
2 голосов
/ 13 октября 2011

У нас есть служба Windows, созданная в .NET 2.0. Я установил Platform Target на X86, а установщик на X86. Проекты, на которые он ссылается, имеют значение ANYCPU.

Мы запускаем это на 64-битном сервере. Он должен быть 32-битным, потому что драйверы ODBC, к которым он обращается, 32-битные, и они сильно бомбят, если к ним обращается из 64-битного приложения.

Я видел, что на 64-битной машине некоторые процессы имеют * 32 рядом с ними для обозначения 32-битной, однако, похоже, что это не так с тестовой, которую я создал, специально предназначенной для 32-битной (X86), чтобы увидеть если это действительно было так. Запускаемая нами служба не отображает * 32 рядом с именем службы.

Есть мысли по этому поводу? Если он не запускается как 32-разрядный (X86), то я удивлен, поскольку заставил сборку быть такой.


Обновление. Мы обнаружили, что он работает в 64-битном режиме, хотя проект Services был вынужден завершить работу в режиме X86. Что вызвало бы это?

Ответы [ 4 ]

6 голосов
/ 14 октября 2011

Вы можете использовать IntPtr.Size ( MSDN документы). Это вернет 4, если работает как 32-битный и 8, если работает как 64-битный.

4 голосов
/ 14 октября 2011

Используйте corflags.exe , чтобы пометить сборку как 32-разрядную. Вы можете сделать это как шаг после сборки, если хотите:

corflags.exe MyProgram.exe /32Bit+

У меня нет ответа на ваш второй вопрос (для этого может потребоваться создать отдельный SO-вопрос), почему проект x86 работает как 64-битный процесс.

1 голос
/ 14 октября 2011

Одно правдоподобное объяснение несоответствия заключается в том, что вы развертываете выходные данные другой конфигурации сборки.

Может ли быть так, что вы настроили свою конфигурацию Debug на целевую версию x86, но не внесли изменения в конфигурацию Release, оставив ее как AnyCPU и развернув ее в рабочей среде?

0 голосов
/ 01 июля 2014
private static bool Is64BitConfiguration()
{
     return System.IntPtr.Size == 8;
}
...