Разработка для 64-битных и 32-битных - PullRequest
3 голосов
/ 08 октября 2010

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

Проблема, однако, в том, что мы не хотим «переходить».Мы хотим поддерживать и то, и другое, без необходимости дублировать кодовую базу для каждой модификации, которую мы выполняем.И под «мы» я имею в виду «я», так как я являюсь единственным разработчиком, и это эффективно снизит мою производительность на треть для дублирования изменений.

Я понимаю, что для простого приложения на C # я могупросто скомпилируйте версию, которая будет работать независимо от архитектуры, и сможете это сделать.Тем не менее, у меня есть разрыв в выяснении, как обращаться с драйверами и библиотеками, которые я использую.Я думаю, что было бы тривиально просто написать 2 разных установщика, каждый из которых устанавливает соответствующие драйверы, но как мне на самом деле ссылаться на эти DLL в приложении?Если я ссылаюсь на 32-битные драйверы, но устанавливаю 64-битные драйверы, я получаю ошибки, что не удается найти подходящие библиотеки.Попытка сослаться на оба не исправит ситуацию, так как один всегда будет отсутствовать.

Как мне справиться с этим правильно?Я хотел бы получить идеи как на стороне установки (правильно ли я использую 2 отдельных установщика), так и на то, как правильно ссылаться на библиотеки DLL, чтобы учесть любой из них.

Ответы [ 5 ]

2 голосов
/ 08 октября 2010

Оптимальное решение, как предлагает Reinderien: пусть установщик справится с этим.

Если по какой-то причине вы хотите установить как 32-, так и 64-разрядные библиотеки DLL и заставить ваше приложение определить, какие из них загрузить, вам пригодится функция API SetDllDirectory . Ваш атрибут p / invoke DllImport может использовать «SomeLib.dll», и вы можете использовать SetDllDirectory для указания на подкаталоги. \ Lib32 или. \ Lib64. Вы сделаете это как можно скорее, вероятно, первым делом в Main.

1 голос
/ 08 октября 2010

Можете ли вы просто сослаться на один общий файл с именем .dll, и будет ли эта DLL 64-битной или 32-битной, как установлено установщиком? Кроме того, если вы можете полагаться на целевую файловую систему NTFS, вы можете использовать символическую ссылку на 32-битную или 64-битную DLL при необходимости.

0 голосов
/ 23 декабря 2010

Вы должны сделать 2 отдельных установщика. Затем используйте третий проект развертывания с пользовательским действием для загрузки правильного установщика.

Я привел пример этого поста: Один MSI для установки правильного 32 или 64-битного приложения c #

0 голосов
/ 08 октября 2010

Лучше всего сделать две настройки, поэтому у вас будут проблемы с поиском информации о гибриде, поскольку Microsoft заявляет о 2 настройках, а сторонняя установка IDE, например, installshield, одобряет эту политику.

В Installshield вы будете использовать флаги выпуска, которые вы передаете в командной строке Installsheild при сборке установки. Вы делаете 2 модуля слияния, один для 32 и один для 64, содержащий ваши драйверы для каждой платформы, когда сборка установки, ваш флаг выпуска, уже назначенный каждому модулю слияния, позволяет выбрать 32 бита, если ваше здание 32 и наоборот.

Кстати, если ваше приложение работает на Windows, очень вероятно, что ваши клиенты будут мигрировать быстрее, чем вы ожидаете, как только ваша 64-битная версия станет доступной. В прошлый раз, когда я начал поддерживать сборку с двумя платформами, она должна была продолжаться годами, и в итоге мы прекратили сборку 32-битной системы всего через несколько месяцев.

0 голосов
/ 08 октября 2010

Ознакомьтесь со статьей ScottHanselmans " Назад к основам: 32-битная и 64-битная путаница вокруг x86 и x64 и .NET Framework и CLR ".

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

Я могу добавить одну вещь: можете ли вы абстрагировать драйверы (или код, который работает с драйверами) через DependencyИнъекция - как вы бы абстрагировали доступ к данным в приложении N-уровня?

...