Programaticamente modificar Assembléia Binding
-
18-09-2019 - |
Pergunta
Eu tenho um trabalho questão com Microsoft.Build.BuildEngine que deveria ficar fixo modifing meu arquivo exe.config para adicionar o seguinte.
<?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>
O meu problema é que eu não posso modificar o arquivo, eu tenho que corrigi-lo por código, e eu acho que é suposto ser possível, certo?
Mas como ?, como posso modificar o meu pedido para que ele funcione como se as alterações acima foram feitas no arquivo de configuração?
Solução
Eu estava lutando com um problema semelhante. A chave é usar o href="http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx" rel="noreferrer"> AppDomain.AssemblyResolve evento Este ignora completamente o número da versão e substitui a biblioteca já carregado para qualquer referência biblioteca denominada "FooLibrary". Você pode usar os outros atributos da classe 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;
}
AssemblyName
se você quiser ser mais restritiva. FooClass
pode ser qualquer classe no FooLibrary montagem.
Outras dicas
Uma maneira de fazer isso é criar um aplicativo bootstrapping que quando lançou iria começar a sua aplicação original em um appdomain separado. Quando você configurar o novo domínio que você será capaz de construir o arquivo de configuração de programação.