Почему мое приложение WinForms не скомпилировано для выхода "x86" на компьютере "x64" при запуске вне "C: \ Program Files (x86)"? - PullRequest
0 голосов
/ 25 апреля 2009

У нас есть приложение WinForms, которое отлично работает на x86, но имеет много сторонних компонентов, которые делают вызовы win32. Чтобы заставить приложения работать на x64, я сейчас скомпилирую для платформы x86. Мы привыкли устанавливать толстый клиент вне системного раздела на серверах, поэтому вчера мы установили в F: \ Program Files (x86) на сервере Win2003 x64. При запуске из этого каталога процессы отказывались выходить. Я пытался убить их в Диспетчере задач, Taskkill и Process Explorer, но ничто, кроме перезагрузки сервера, не убило бы эти процессы. Когда я удаляю и переустанавливаю в C: \ Program Files (x86), процессы завершаются нормально.

Действительно ли место установки имеет значение при запуске приложений WinForms, скомпилированных для x86, на компьютере x64?

Ответы [ 2 ]

1 голос
/ 25 апреля 2009

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

Возможно, ваше приложение использует значение, которое зависит от архитектуры процессора, под которым оно выполняется, для поиска каталога. Возьмите, например, переменную среды ProgramFiles. На 64-битном компьютере переменная среды ProgramFiles фактически указывает на каталог «Program Files (x86)» для 32-битного приложения. Возможно, ваша программа пытается загрузить данные, подобные приведенным ниже, и выдает сбой

string root = Environment.GetVariable("ProgramFiles");
string file = Path.Combine(root, "MyAppName\DataDirectory\SomeDataFile.txt");
string data = File.ReadAllLines(file);  

Последняя строка потерпит неудачу, потому что путь будет преобразован в

c: \ program files (x86) \ MyApplication \ DataDirectory \ SomeDataFile.txt

Но приложение было развернуто в Program Files. Таким образом, реальный путь будет

c: \ program files \ MyApplication \ DataDirectory \ SomeDataFile.txt

1 голос
/ 25 апреля 2009

Из своего опыта я могу сказать, что можно запускать двоичные файлы x86 на системах x64 практически из любого места (не проверял, работает ли все еще, если бинарный файл находится в system32, но я уверен, что программы x86 могут работать из программных файлов). Я считаю, что папки Program Files / Program Files (x86) предназначены для того, чтобы можно было легко отличить нативные x64-приложения от старых x86-приложений. Из вашего описания то, с чем вы столкнулись, звучит очень похоже на проблему совместимости с WoW64, однако, если у вас есть зависимости от неуправляемого кода, вы, вероятно, сначала захотите проверить, хорошо ли работает этот неуправляемый код, а затем глубже вникнуть в то, что мешает вашей программе закрытие. Кроме того, было бы полезно узнать, как вы в первую очередь пытаетесь завершить работу приложения, если оно использует несколько потоков или один поток, версию среды выполнения .NET, которая нацелена, и версию, установленную на сервере (вкл. . Пакет обновления).

...