Question

J'ai un problème de travailler avec Microsoft.Build.BuildEngine qui devait se fixe modifing mon fichier exe.config ajouter ce qui suit.

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

Mon problème est, je ne peux pas modifier le fichier, je dois le corriger par le code, et je pense que ce doit être possible, non?

Mais comment ?, comment puis-je modifier ma demande pour qu'il fonctionne comme si les modifications ci-dessus ont été faites sur le fichier de configuration?

Était-ce utile?

La solution

Je ne faisais que du mal à un problème similaire. La clé est d'utiliser le AppDomain.AssemblyResolve événement. Voici ce que mon code ressemble à:

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

ignore complètement le numéro de version et remplace la bibliothèque déjà chargé pour toute référence de bibliothèque nommée « FooLibrary ». Vous pouvez utiliser les autres attributs de la classe AssemblyName si vous voulez être plus restrictive. FooClass peut être une classe dans l'assemblée FooLibrary.

Autres conseils

Une façon de le faire est de créer une application qui bootstrapping lors de son lancement commencerait votre application d'origine dans une appdomain séparée. Lorsque vous configurez le nouveau domaine, vous serez en mesure de construire le fichier de configuration par programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top