x64 Разработка с использованием .NET
Ранее в этом году я перешел на 64-разрядную операционную систему - точнее, Vista Ultimate x64. По большей части этот процесс был относительно безболезненным, но на этом пути было несколько сбоев (в основном, x64-совместимые драйверы, но это не главное в этом обсуждении).
В мире разработки для x64 было несколько проблемных моментов, которые я хотел бы изложить здесь. Этот список, вероятно, будет расти, поэтому ожидайте будущих сообщений по этому вопросу.
В прекрасном мире разработки .NET приложения и сборки могут быть скомпилированы для различных платформ. По умолчанию приложения и сборки компилируются как Любой ЦП в Visual Studio. В этом сценарии CLR загрузит сборку как цель по умолчанию для машины, на которой она выполняется. Например, при запуске исполняемого файла на компьютере x64 он будет выполняться как 64-разрядный процесс.
Visual Studio также предусматривает 3 конкретные цели платформы: x86, x64 и Itanium (IA-64). При создании исполняемого файла в качестве конкретной цели он будет загружен как процесс этого типа. Например, исполняемый файл с целевой архитектурой x86 на компьютере с архитектурой x64 будет работать как 32-разрядный процесс с использованием 32-разрядного уровня CLR и уровня WOW64. Когда сборки загружаются во время выполнения, они могут быть загружены процессом только в том случае, если их цель соответствует цели хост-процесса или она скомпилирована как Любой ЦП. Например, если в качестве цели сборки была выбрана x64, она может быть загружена только процессом x64.
Это вошло в игру в нескольких сценариях для меня:
XNA - XNA доступна только в виде набора 32-разрядных сборок. Поэтому при обращении к сборкам XNA исполняемый файл / сборка, использующая их, должен быть ориентирован на платформу x86. Если он настроен как x64 (или как любой ЦП и работает на 64-разрядной машине), при попытке загрузить сборки XNA будет выдана ошибка.
Microsoft Robotics Studio - XInputGamepadService внутренне использует XNA для связи с контроллером Xbox 360. Смотри выше.
Управляемый DirectX - хотя это уже устарело и заменяется на XNA, оно все еще используется. Сборки не помечены для определенной цели, однако у меня возникли проблемы с исключениями памяти, особенно с сборкой Microsoft.DirectX.AudioVideoPlayback.
Фиджеты - в зависимости от того, какую библиотеку вы загружаете и когда, она может быть помечена или не помечена как 32-разрядная. Текущая версия (11/8/07) помечена как таковая, поэтому для ее размещения требуется 32-разрядный процесс.
Самый простой способ определить, предназначен ли исполняемый файл или сборка для конкретной платформы, - это использовать приложение corflags. Чтобы использовать это, откройте командную строку Visual Studio из меню «Пуск» и запустите ее для сборки, которую вы хотите проверить.
Самый простой способ определить, предназначен ли исполняемый файл или сборка для конкретной платформы, - это использовать приложение corflags. Чтобы использовать это, откройте командную строку Visual Studio из меню «Пуск» и запустите ее для сборки, которую вы хотите проверить.