Ninguna de las soluciones anteriores o cualquier artículo que funcionó para mí en el proyecto de implementación/configuración. Pasé muchos días para encontrar la solución correcta. Finalmente, este enfoque funcionó para mí.
Pre REQUISITOS utilidad
He usado llama cct.exe para transformar archivos de forma explícita. Puede descargar desde aquí http://ctt.codeplex.com/
He usado instalador personalizado en el proyecto de instalación para capturar eventos de instalación.
Siga estos pasos para lograr la transformación aplicación de configuración
1) Añadir los archivos de configuración deseados a su proyecto y modificar el archivo .csproj como estos
<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>
Los he añadido como contenido para que se pueden copiar en el directorio de salida.
2) Agregue cct.exe a su proyecto que descargó.
3) Añadir instalador encargo a su proyecto que debería tener este aspecto
[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();
}
}
Aquí estoy usando dos controladores de eventos CustomInstaller_AfterInstall en el que yo estoy cargando el archivo de configuración correcta y transformadora. En MyInstaller_Committed Estoy borrando los archivos de transformación que no necesitamos en la máquina cliente una vez que aplicamos se ha aplicado. También estoy sangrando el archivo transformado porque cct simplemente transforma elementos que estaban alineados feos.
4) Abra su proyecto de configuración y agregue el archivo de contenido de salida del proyecto para que la configuración pueda copiar los archivos de configuración como app.uat.config, app.live.config etc. en la máquina del cliente.
En el paso anterior, este fragmento cargará todos los archivos de configuración disponibles, pero necesitamos de alimentación correcta archivo de transformación
string[] transformationfiles = Directory.GetFiles(Path.GetDirectoryNam
(Assembly.GetExecutingAssembly().Location), "app.*.config");
Para que he añadido de diálogo de configuración de la interfaz de usuario en el proyecto para obtener la configuración actual. El cuadro de diálogo ofrece opciones para que el usuario seleccione un entorno como "Live" "UAT", "Test", etc. Ahora pase el entorno seleccionado a su instalador personalizado y fíltrelos.



llegará a ser extenso artículo si me explico sobre cómo añadir diálogo, cómo configurar parametros etc así que por favor google ellos. Pero la idea es transformar el entorno seleccionado por el usuario. La ventaja de este enfoque es que puede usar el mismo archivo de instalación para cualquier entorno.
Aquí está el resumen:
Añadir archivos de configuración
Añadir CCT exe
Añadir instalador personalizado
Aplicar transformación en exe.config bajo después de instalar evento
archivos de transformación Eliminar en la máquina del cliente
proyecto de instalación modificar de una manera tal que
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
solución podría ser largo, pero no tienen otra opción, porque MSI siempre una copia app.config y no se preocupa por los eventos y transformaciones de construcción del proyecto. slowcheetah sólo funciona con ClickOnce no proyecto de instalación
¡Hola! ¿Has resuelto tu problema? Si necesita ayuda, solo infórmeme e intentaré ayudarlo. ;) –
Gracias. Tu reseña se ve bastante bien. No he tenido la oportunidad de probarlo todavía, aunque espero hacerlo en los próximos días. Te avisaré si encuentro algún problema. Gracias por incluir esos detalles. – recursive