2009-09-22 5 views
11

Mam kilka aplikacji .NET w języku C#, wraz z interfejsem API umożliwiającym im dostęp do bazy danych. Chcę umieścić wszystkie wersje interfejsu API w bazie danych i wybrać dla nich najwyższy numer wersji i kompilacji, ale pozostać przy dużej i mniejszej liczbie, z jaką zostały zbudowane. Zasadniczo, kiedy odwołuję się do API 1.2.3.4, chcę, aby odnośnik przeczytał 1.2.*.*, aby aplikacje po prostu podniosły 1.2.3.5 Widzę, że mogę to zrobić z plikami konfiguracyjnymi XML. Wolałbym, żeby to było zgodne. Podobne do publikowania zasad, ale bez dodatkowych plików. Mógłbym to załatwić. Drugim problemem są wszystkie rozwiązania, które widzę, przekierowuję jedną wersję do innej konkretnej wersji, nie tylko do każdej nowszej wersji.Jak korzystać z funkcji powiązania wiązań zespołu, aby zignorować numery wersji i kompilacji

Jak to zrobić?

Czy ktoś może wskazać mi źródło informacji o polityce wydawców?

Odpowiedz

5

AppDomain.AssemblyResolve wydarzenie powinno pomóc.

25

Dzięki leppie's suggestion używania zdarzenia AppDomain.AssemblyResolve udało mi się rozwiązać podobny problem. Oto co mój kod wygląda następująco:

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

Ten całkowicie ignoruje numer wersji i zastępuje już załadowane biblioteki dla jakiegokolwiek odniesienia biblioteki o nazwie „FooLibrary”. Możesz użyć innych atrybutów klasy AssemblyName, jeśli chcesz być bardziej restrykcyjna. FooClass może być dowolną klasą w zespole FooLibrary.

+1

Próbuję to zrobić w kontekście aplikacji ASP.NET. Gdzie mogę podłączyć się do zdarzenia AppDomain.CurrentDomain.AssemblyResolve? Na poziomie zdarzenia aplikacji (np. Global.asax)? –

+0

Myślę, że powinieneś być w stanie zarejestrować się na wydarzenie 'AssemblyResolve' z dowolnego miejsca. Nie ma nic szczególnego w metodzie 'LoadStuff()'. Jeśli zdecydujesz się zarejestrować na wydarzenie za każdym razem, gdy ładujesz zespół, pamiętaj, aby wyrejestrować się, gdy skończysz. –

+0

Awesome man. Dokładnie to, czego szukałem – Jupaol

Powiązane problemy