Frage

Ich habe ein Problem, die Arbeit mit Microsoft.Build.BuildEngine , die meine .exe.config Datei erhalten feste soll modifing folgendes hinzuzufügen.

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

Mein Problem ist, ich kann die Datei nicht ändern, ich habe es zu beheben, indem Code, und ich denke, das möglich sein soll, nicht wahr?

Aber wie ?, wie kann ich meine Anwendung ändern, damit es läuft, als ob die oben genannten Änderungen an der Konfigurationsdatei vorgenommen wurden?

War es hilfreich?

Lösung

Ich war gerade mit einem ähnlichen Problem zu kämpfen. Der Schlüssel ist das AppDomain.AssemblyResolve Ereignis zu verwenden. Hier ist, was mein Code wie folgt aussieht:

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

Dies ignoriert vollständig die Versionsnummer und ersetzt die bereits geladene Bibliothek für jede Bibliothek Referenz namens „FooLibrary“. Sie können die anderen Attribute der AssemblyName Klasse verwenden, wenn Sie restriktiver sein wollen. FooClass kann jede Klasse in der FooLibrary Montage.

Andere Tipps

Eine Möglichkeit, es zu tun, ist einen Bootstrap-App zu schaffen, die nach dem Abwurf würde Ihre ursprüngliche App in einem separaten Appdomain starten. Wenn Sie die neue Domain einrichten können Sie programmatisch die Config-Datei erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top