Один и тот же исходный код на двух машинах приводит к различному поведению исполняемого файла

StackOverflow https://stackoverflow.com/questions/86959

Вопрос

Вот такой сценарий:

Проект приложения C # для Windows, хранящийся в SVN, используется для создания исполняемого файла.Обычно сервер сборки обрабатывает процесс сборки и создает сборки через регулярные промежутки времени, которые используются при тестировании.В этом конкретном случае меня попросили изменить конкретную сборку и создать исполняемый файл.

Я не совсем уверен, изменяет ли сервер сборки файлы проекта, но я знаю, что он создает тег в SVN исходного кода, который он использовал для компиляции исполняемых файлов.Используя этот тег, я проверил код на второй машине, которая является машиной разработки.Затем я скомпилировал исходный код на компьютере разработчика.

При выполнении приложение, скомпилированное на компьютере разработчика, функционирует не совсем так, как приложение, скомпилированное сервером сборки.Например, на тестирующих машинах приложение обнаруживает выполнение синтаксического анализа по дате и времени.Однако исполняемый файл машины сборки не выдает никаких исключений.Если я запускаю исполняемый файл на компьютере разработки, никаких исключений не возникает.

Таким образом, теоретически обе машины используют один и тот же исходный код и проекты.
Исполняемый файл машины разработки работает только на машине разработчика.Исполняемый файл машины сборки работает на каждом компьютере, включая компьютер разработчика.

Хранятся ли региональные настройки компьютера или часовой пояс в скомпилированном исполняемом файле?Есть идеи, что может вызвать такое поведение или как проверить исполняемые файлы, чтобы найти возможные различия и исправить их?

К сожалению, я не могу взять тестовую машину и подключить к ней отладчик.Я сделаю это, как только смогу.

Это было полезно?

Решение

Приложение использует региональные настройки компьютера, на котором оно запущено, и, похоже, это ваша проблема.Вы можете заставить поток использовать определенный язык, установив System.Потоковая обработка.Нитки.Текущий поток.Текущая культура и система.Многопоточность.Нитки.Текущий поток.Приведение текущей культуры к определенному значению.

Другие советы

Возможно, что на двух машинах установлены разные версии базовой библиотеки dll, которая не является частью вашего процесса сборки.Я видел, как это происходило при распределении сервисов по нашей внутренней ферме серверов.

Можете ли вы запустить программу на компьютере сборки под управлением отладчика?

Если это так, то отладьте проблему - нет необходимости гадать.

Попросите отладчик на машине разработки перехватить исключение, установите точку останова в том же месте на машине сборки.Посмотрите, в чем разница между ними.

Я видел, что различные "Региональные и языковые параметры" в XP вызывают подобное поведение.Совпадают ли они на обеих машинах?Пуск | Настройки | Панель управления | Региональные и языковые параметры...

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

Откуда берется дата, которая анализируется?Если это есть в вашей базе данных, возможно, у вас тоже плохие данные.

Однажды у меня была похожая проблема (за исключением C ++), Когда я сравнивал размеры скомпилированных исполняемых файлов, они были далеки друг от друга.К сожалению, после нескольких дней поисков лучшим решением, которое я нашел, было удалить VS05 и переустановить его.

Могу я спросить, зачем вы вообще используете сервер сборки для кода на C #?

Время сборки для C #, когда я его использовал, было едва заметным (<2с).Действительно ли приложение такое большое?

Система сборки, вероятно, создает релизную версию, в то время как ручная сборка на КОМПЬЮТЕРЕ разработчика создает отладочную версию.Отладочная версия содержит больше проверок на ошибки.Посмотрите, сможете ли вы вручную создать релизную версию и посмотреть, есть ли еще различия.

Один и тот же исходный код встречается редко, если каждый создает одну и ту же программу на разных компьютерах.Вы всегда должны предполагать, что программы разные, никогда не ожидайте, что они будут одинаковыми.В такой среде, как linux, с хорошим менеджером пакетов и периодическими и / или случайными обновлениями, никогда не ожидайте, что один и тот же исходный код создаст одну и ту же программу на одном компьютере.Чем выше уровень языка, тем хуже он становится.Создание программы для отладчика кардинально отличается от создания для выпуска.Версия debugger даже без отладчика скрывает ошибки, которые вы не найдете, пока не перейдете к сборке release.По сути, вам приходится отлаживать программу дважды, если вы слишком полагаетесь на среду отладчика.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top