Запустите 64-битный процесс во время 32-битного установщика, чтобы изменить 32-битный и 64-битный .NET machine.config - PullRequest
0 голосов
/ 05 августа 2011

Я создал поставщика данных ADO.NET, который построен с использованием AnyCPU.При прямой ссылке он отлично работает как на 64, так и на 32-битной ОС Windows.Однако в моем установщике я регистрирую свой DbProviderFactory в .NET machine.config и помещаю свои сборки в GAC, чтобы пользователи могли получить доступ к поставщику данных через System.Windows.DbProviderFactories.Это прекрасно работает до тех пор, пока приложение работает как 32-разрядное.Он не работает для приложений, созданных для x64.

Это то, что я нашел.Мой установщик предназначен для 32-разрядных.Поэтому мой DbProviderFactory добавляется только в 32-разрядный .NET machine.config.Чтобы приложения x64 могли использовать мой поставщик данных через DbProviderFactories, его необходимо зарегистрировать в 64-разрядном .NET machine.config.

Нужно ли иметь два установщика?Один таргетинг 32, а другой 64?Все мои сборки являются AnyCPU (потому что я не знаю и не волнуюсь, на какой платформе находится приложение пользователя).

Мое несколько сложное решение было таким.Во время установки у меня есть пользовательское действие, которое проверяет, является ли ОС 64-битной ( здесь ).Если это так, я хочу запустить процесс, который запускает 64-битное консольное приложение, которое добавит мой DbProviderFactory в machine.config (64-битный).И мой установщик сам зарегистрируется в 32-битном файле machine.config.Я попытался, и это не удалось, так как у меня не может быть 64-битной сборки в проекте установки, который нацелен на 32-битную версию.Однако я собираюсь попытаться создать консольное приложение с использованием AnyCPU, предполагая, что оно будет работать как 64-разрядный процесс на 64-разрядных ОС.

Это довольно грязно, но я думаю это будет работать.Почему это плохая идея?И почему Microsoft говорит: «Чтобы распространять приложение .NET Framework как на 32-, так и на 64-разрядные платформы, создайте два пакета MSI, один для 32-разрядного, а другой для 64-разрядного компьютера» ( msdn ).Будет ли это работать, поскольку технически все мои сборки являются AnyCPU?

Также я использую .NET 3.5

1 Ответ

1 голос
/ 08 августа 2011

Чтобы ответить на мои собственные вопросы:

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

2) Это не плохая идея, скорее, это хорошая идея, потому что мне нужно только распространить один установщик среди клиентов, и он волшебным образом преобразует дополнительные действия по установке для 64-разрядных машин.

3) Я думаю, что M $ говорит, чтобы иметь оба установщика, если сборки или включенные ссылки явно созданы для 32 или 64 бит.

Окончательное решение: в моем 32-разрядном установщике я регистрирую сборку в machine.config. Затем я проверяю, является ли ОС 64-битной (используя ссылку, указанную на моем вопросе). Если это так, я запускаю утилиту командной строки (входит в мой установщик), которая создана для AnyCPU как отдельный процесс. Утилита регистрирует мои сборки в 64-битном файле machine.config. Это работает, потому что утилита AnyCPU запускается только как новый процесс в 64-битной ОС, при условии, что по умолчанию она будет 64-битным процессом. Готово.

...