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

Я создал поставщик данных 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.


person codyzu    schedule 05.08.2011    source источник
comment
Я не уверен, что это сработает, так как 32-битный msi-установщик запускается как 32-битный процесс. Что должно привести к тому, что DLL AnyCPU будет работать как 32-битная (DLL AnyCPU работает внутри 32-битного процесса). Следовательно, необходимо иметь 64- и 32-битный установщик MSI.   -  person Chris Chilvers    schedule 05.08.2011
comment
Я хочу, чтобы 32-битный установщик msi запускал новый процесс, который выполняет консольное приложение AnyCPU (exe), но только если мы работаем в 64-битной ОС. Теоретически этот новый процесс должен работать как 64-битный (и иметь доступ к 64-битному файлу machine.config).   -  person codyzu    schedule 05.08.2011
comment
MSI сильно зависит от разрядности. Может быть, когда-нибудь они исправят это, вероятно, когда никто больше не будет устанавливать 32-битные операционные системы. Просто запустить две установки — очень простое решение. Вам в любом случае.   -  person Hans Passant    schedule 05.08.2011


Ответы (1)


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

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

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

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

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

person codyzu    schedule 08.08.2011