Domanda

Ho un problema a lavorare con Microsoft.Build.BuildEngine , che dovrebbe ottenere fisso modifing mio file exe.config aggiungere la seguente.

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

Il mio problema è che non riesco a modificare il file, devo risolvere il problema da codice, e penso che si suppone sia possibile, giusto?

Ma come ?, come posso modificare la mia applicazione in modo che funziona come se le suddette modifiche sono state apportate al file di configurazione?

È stato utile?

Soluzione

Stavo solo alle prese con un problema simile. La chiave è quella di utilizzare il AppDomain.AssemblyResolve evento. Ecco ciò che il mio codice è simile:

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

Questo ignora completamente il numero di versione e sostituisce la libreria già caricato per qualsiasi riferimento libreria denominata "FooLibrary". È possibile utilizzare gli altri attributi della classe AssemblyName se si vuole essere più restrittive. FooClass può essere qualsiasi classe nel gruppo FooLibrary.

Altri suggerimenti

Un modo per farlo è quello di creare un'applicazione bootstrapping che una volta lanciato avrebbe cominciato la vostra applicazione originale in un AppDomain separato. Quando si imposta il nuovo dominio si sarà in grado di costruire il file di configurazione a livello di codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top