2009-09-22 3 views
11

Ich habe mehrere .NET-Anwendungen in C#, zusammen mit einer API für den Zugriff auf die Datenbank. Ich möchte alle Versionen der API in die Datenbank aufnehmen und sie die höchste Revisions- und Build-Nummer wählen lassen, aber bei der Major- und Minor-Nummer bleiben, mit der sie gebaut wurden. Grundsätzlich, wenn ich referenziere API 1.2.3.4 Ich möchte die Referenz zu lesen 1.2.*.*, so dass die Anwendungen nur abholen 1.2.3.5 Ich sehe, ich kann dies mit XML-Konfigurationsdateien tun. Ich hätte es lieber eingehalten. Ähnlich den Veröffentlichungsrichtlinien, aber ohne die zusätzlichen Dateien. Ich könnte mich damit zufrieden geben. Das andere Problem sind alle Lösungen, die ich sehe, eine Version zu einer anderen spezifischen Version umleiten, nicht nur zu einer neueren Version.Verwendung der Assembly Binding Redirection zum Ignorieren von Revisions- und Build-Nummern

Wie mache ich das?

Kann mir jemand auf eine informative Quelle für Publisher-Richtlinien verweisen?

Antwort

5

AppDomain.AssemblyResolve Ereignis sollte helfen.

25

Dank leppie's suggestion der Verwendung des AppDomain.AssemblyResolve Ereignisses konnte ich ein ähnliches Problem lösen. 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; 
    } 

Diese vollständig die Anzahl Version ignoriert und ersetzt die bereits geladene Bibliothek für jede Bibliothek Referenz namens „FooLibrary“. Sie können die anderen Attribute der Klasse AssemblyName verwenden, wenn Sie restriktiver sein möchten. FooClass kann eine beliebige Klasse in der FooLibrary-Assembly sein.

+1

Ich versuche, dies im Zusammenhang mit einer ASP.NET-Anwendung zu tun. Wo kann ich mich in das AppDomain.CurrentDomain.AssemblyResolve-Ereignis einklinken? Auf einer Anwendungsereignisebene (d. H. Global.asax)? –

+0

Ich denke, Sie sollten in der Lage sein, sich für das 'AssemblyResolve'-Event von überall aus zu registrieren. Die 'LoadStuff()' Methode hat nichts besonderes. Wenn Sie sich jedes Mal für das Ereignis registrieren, wenn Sie eine Assembly laden, denken Sie daran, die Registrierung aufzuheben, wenn Sie fertig sind. –

+0

Awesome Mann. Genau das, was ich gesucht habe – Jupaol

Verwandte Themen