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