Как обновить как 32-битную, так и 64-битную машину.config

Наше решение представляет собой набор окон и веб-сервисов, которые могут работать на одном компьютере или быть полностью распределенными.

Нам нужен только один фрагмент конфигурации, чтобы связать все это вместе (это конечная точка RabbitMq, но это не важно).

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

По желанию мы бы поместили один кусок конфигурации в файл .net machine.config. Моя текущая задача — написать простой пользовательский интерфейс win-forms для обновления файла machine.config с нашей частью конфигурации.

Однако по умолчанию открытие конфигурации машины с помощью

config = System.Configuration.ConfigurationManager.OpenMachineConfiguration();

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

Есть ли известный и безопасный способ сделать это?

Мой первый инстинкт — иметь консольное приложение, которое пользовательский интерфейс может вызывать для фактического обновления, и иметь 2 разных варианта: 32-битный и 64-битный.

Или есть лучший способ сделать это?


person Binary Worrier    schedule 07.11.2013    source источник
comment
Я знаю, что в MVC вы можете делать Web.Debug.config и Web.Release.config, и при компиляции он выберет соответствующее преобразование - может быть, есть что-то подобное для 32- и 64-битных приложений...   -  person dav_i    schedule 07.11.2013
comment
Я сделал что-то подобное этому. stackoverflow.com/questions/32400437/   -  person dko    schedule 14.09.2015


Ответы (1)


Я думаю, вы должны иметь возможность использовать метод OpenMappedMachineConfiguration в ConfigurationManager, чтобы открыть конкретный файл конфигурации машины.

var path = "path to desired machine config";
ConfigurationFileMap cfm = new ConfigurationFileMap(path);
Configuration config = ConfigurationManager.OpenMappedMachineConfiguration(cfm);

Дополнительную информацию об этом методе можно найти здесь: http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.openmappedmachineconfiguration(v=vs.110).aspx

person Brian Knight    schedule 07.11.2013
comment
Хорошо, но можете ли вы быть уверены, что файл конфигурации машины всегда будет иметь адрес C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config? - person Binary Worrier; 07.11.2013
comment
Вы можете использовать System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() для текущего времени выполнения. В качестве альтернативы вы можете заменить Framework64 на Framework или наоборот. - person Brian Knight; 07.11.2013
comment
. . . и это не работает. Когда вы пытаетесь открыть 32-битную конфигурацию из 64-битного процесса, вызов OpenMappedMachineConfiguration возвращает ноль, так что хорошая попытка, но не сигара :) - person Binary Worrier; 07.11.2013
comment
. . . и простите меня, потому что ЭТО РАБОТАЕТ (как правило, я делал что-то еще неправильно). Благодарю вас, сэр, за всю вашу помощь! - person Binary Worrier; 07.11.2013