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?

Foi útil?

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

    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;
    }

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 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top