Ни одно из вышеуказанных решений или каких-либо статей не работало для меня в проекте развертывания / настройки.Потратил много дней, чтобы найти правильное решение.Наконец, этот подход сработал для меня.
Предварительные требования
Я использовал утилиту cct.exe для явного преобразования файла.Вы можете скачать здесь http://ctt.codeplex.com/
Я использовал пользовательский установщик в проекте установки для захвата событий установки.
Выполните следующие шаги, чтобы выполнить преобразование конфигурации приложения
1)Добавьте нужные файлы конфигурации в свой проект и измените свой файл .csproj, например,
<Content Include="app.uat.config">
<DependentUpon>app.config</DependentUpon>
</Content>
<Content Include="app.training.config">
<DependentUpon>app.config</DependentUpon>
</Content>
<Content Include="app.live.config">
<DependentUpon>app.config</DependentUpon>
</Content>
Я добавил их в качестве содержимого, чтобы их можно было скопировать в выходной каталог.
2)Добавьте cct.exe к загруженному проекту.
3) Добавьте пользовательский установщик к своему проекту, который должен выглядеть следующим образом
[RunInstaller(true)]
public partial class CustomInstaller : System.Configuration.Install.Installer
{
string currentLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string[] transformationfiles = Directory.GetFiles(Path.GetDirectoryNam(Assembly.GetExecutingAssembly().Location), "app.*.config");
public CustomInstaller()
{
InitializeComponent();
// Attach the 'Committed' event.
this.Committed += new InstallEventHandler(MyInstaller_Committed);
this.AfterInstall += new InstallEventHandler(CustomInstaller_AfterInstall);
}
void CustomInstaller_AfterInstall(object sender, InstallEventArgs e)
{
try
{
Directory.SetCurrentDirectory(currentLocation);
var environment = Context.Parameters["Environment"];
var currentconfig = transformationfiles.Where(x => x.Contains(environment)).First();
if (currentconfig != null)
{
FileInfo finfo = new FileInfo(currentconfig);
if (finfo != null)
{
var commands = string.Format(@"/C ctt.exe s:yourexename.exe.config t:{0} d:yourexename.exe.config ", finfo.Name);
using (System.Diagnostics.Process execute = new System.Diagnostics.Process())
{
execute.StartInfo.FileName = "cmd.exe";
execute.StartInfo.RedirectStandardError = true;
execute.StartInfo.RedirectStandardInput = true;
execute.StartInfo.RedirectStandardOutput = true;
execute.StartInfo.UseShellExecute = false;
execute.StartInfo.CreateNoWindow = true;
execute.StartInfo.Arguments = commands;
execute.Start();
}
}
}
}
catch
{
// Do nothing...
}
}
// Event handler for 'Committed' event.
private void MyInstaller_Committed(object sender, InstallEventArgs e)
{
XmlDocument doc = new XmlDocument();
var execonfigPath = currentLocation + @"\yourexe.exe.config";
var file = File.OpenText(execonfigPath);
var xml = file.ReadToEnd();
file.Close();
doc.LoadXml(FormatXmlString(xml));
doc.Save(execonfigPath);
foreach (var filename in transformationfiles)
File.Delete(filename);
}
private static string FormatXmlString(string xmlString)
{
System.Xml.Linq.XElement element = System.Xml.Linq.XElement.Parse(xmlString);
return element.ToString();
}
}
Здесь я использую два обработчика событий CustomInstaller_AfterInstall , в которые загружаю правильный файл конфигурации и преобразую.В MyInstaller_Committed Я удаляю файлы преобразования, которые нам не нужны, на клиентской машине после применения.Я также делаю отступ для преобразованного файла, потому что cct просто преобразовывает элементы, выровненные безобразно.
4) Откройте ваш проект установки и добавьте выходной файл проекта, чтобы программа установки могла копировать файлы конфигурации, такие как app.uat.config, app.live.config и т. д. на клиентский компьютер.
На предыдущем шаге этот фрагмент загрузит все доступные файлы конфигурации, но нам нужно указать правильный файл преобразования
string[] transformationfiles = Directory.GetFiles(Path.GetDirectoryNam
(Assembly.GetExecutingAssembly().Location), "app.*.config");
. Для этого я добавил диалоговое окно пользовательского интерфейса при настройке.проект, чтобы получить текущий конфиг.Диалог дает пользователю возможность выбрать среду, такую как «Live», «UAT», «Test» и т. Д.Теперь передайте выбранную среду своему пользовательскому установщику и отфильтруйте их.
Будет длинная статья, если я объясню, как добавить диалог, как установитьи т.д., пожалуйста, гуглите их.Но идея состоит в том, чтобы преобразовать выбранную пользователем среду.Преимущество этого подхода в том, что вы можете использовать один и тот же установочный файл для любой среды.
Вот сводка:
Добавление файлов конфигурации
Добавление файла cct exe
Добавить пользовательский установщик
Применить преобразование к exe.config в после события установки
Удалить файлы преобразования с компьютера клиента
Изменить проект установки таким образом, чтобы
set up should copy all config files(project output content) and cct.exe into output directory
configure UI dialog with radio buttons (Test,Live,UAT..)
pass the selected value to custom installer
Решение может выглядеть длинным, но у него нет выбора, потому что MSI всегда копирует app.config и не заботится о событиях сборки проекта и преобразованиях.slowcheetah работает только с clickonce not setup project