2009-12-08 29 views
5

Tengo un problema al trabajar con Microsoft.Build.BuildEngine que se supone que se ha modificado modificando mi archivo .exe.config para agregar lo siguiente.Programmatically modify Ensamblado Encuadernación

<?xml version ="1.0"?> 
<configuration> 
     <runtime> 
      <assemblyBinding xmlns="urnchemas-microsoft-com:asm.v1"> 
      <dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Framework" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
       <assemblyIdentity name="Microsoft.Build.Engine" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> 
       <bindingRedirect oldVersion="0.0.0.0-99.9.9.9" newVersion="3.5.0.0"/> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Mi problema es que no puedo modificar el archivo, tengo que solucionarlo por código, y creo que se supone que es posible, ¿verdad?

¿Pero cómo ?, ¿cómo puedo modificar mi aplicación para que se ejecute como si los cambios anteriores se hubieran realizado en el archivo de configuración?

+0

gracias David ... por favor, diga lo que hizo para corregir el formato correcto del xml – sebagomez

+0

Para formatear un bloque de código, necesita una línea en blanco antes, y luego al menos cuatro espacios al comienzo de cada línea de código. –

Respuesta

10

Estaba luchando con un problema similar. La clave es usar el evento AppDomain.AssemblyResolve. Esto es lo que se ve mi código como:

public void LoadStuff(string assemblyFile) 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += 
      new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
     var assembly = Assembly.LoadFrom(assemblyFile); 

     // Now load a bunch of types from the assembly... 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var name = new AssemblyName(args.Name); 
     if (name.Name == "FooLibrary") 
     { 
      return typeof(FooClass).Assembly; 
     } 
     return null; 
    } 

Esto ignora por completo el número de versión y sustituye a la biblioteca ya cargado para cualquier referencia de la biblioteca llamada "FooLibrary". Puede usar los otros atributos de la clase AssemblyName si quiere ser más restrictivo. FooClass puede ser cualquier clase en el ensamblado de FooLibrary.

+0

Esto funcionó perfectamente con MSTest corriendo bajo TFS Build que no recoge el archivo de configuración. –

+0

Tuve algunos problemas en el depurador, donde este evento solo afecta a los ensamblados de recursos. En producción funciona como un encanto. ¡Gracias! –

2

Una forma de hacerlo es crear una aplicación de bootstrapping que, al iniciarse, inicie la aplicación original en un dominio de aplicación separado. Cuando configure el nuevo dominio, podrá construir el archivo de configuración mediante programación.

+0

¿qué quieres decir con escribir el archivo de configuración? No quiero modificarlo programáticamente, quiero ejecutar mi aplicación como si mi configuración ya estuviera modificada. – sebagomez

+2

no modificar - compilar. El contenido del archivo de configuración es uno de los parámetros que puede pasar al método AppDomain.CreateDomain (dentro de la instancia de AppDomainSetup). De esta forma puedes construirlo sobre la marcha – mfeingold