Ostatnio pisałem
o możliwości przenoszenia typu/klasy pomiędzy różnymi assembly
(bibliotekami), pominąłem jednak pewien element. Mianowicie, to co
napisałem jest zgodne z prawdą, gdy nie podpisujemy assembly
(strong name) i nie zmienią się wersje assembly, a przecież często
wersje zmieniane są automatycznie podczas kompilacji. Na szczęście
na to też jest rozwiązanie, a mianowicie przekierowanie wersji
assemlby (Redirecting Assembly Versions).
Zobaczmy przykład.
Mamy następujące solution:
Aplikacja RedirectingAssemblyVersions
ma powiązanie z biblioteką MyClassLibrary przez plik .dll, a nie
jako referencję między projektami. Obydwa assembly jako wersję w
AssemblyInfo mają wpisane:
[assembly: AssemblyVersion("1.0.*")]
Oznacza to, że po każdej kompilacji
wersja assembly się zmienia.
Zawartość pliku Class1.cs:
using System; using System.Reflection; namespace MyClassLibrary { public class MyClass { public static string DoSth() { return Assembly.GetAssembly(typeof(MyClass)).FullName; } } }
natomiast pliku Program.cs:
using System; using MyClassLibrary; using System.Reflection; namespace RedirectingAssemblyVersions { class Program { static void Main(string[] args) { Console.WriteLine("my assemlby: " + Assembly.GetAssembly(typeof(Program)).FullName); Console.WriteLine("lib assemlby:"+ MyClass.DoSth()); Console.ReadLine(); } } }
Po skompilowaniu obydwu elementów w
kolejności: MyClassLibrary, a później
RedirectingAssemblyVersions, powinniśmy otrzymać na ekranie coś
podobnego do:
Jednak gdy skompilujemy w odwrotnej
kolejności, to zobaczymy:
Ale wystarczy przekierować wersję
assembly w pliku app.config, np.:
RedirectingAssemblyVersions.exe.config:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="MyClassLibrary" publicKeyToken="b7abd5f1e8d9cb61" /> <bindingRedirect oldVersion="1.0.3782.40182" newVersion="1.0.3782.40275" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
i wtedy mamy już dobrze działającą
aplikację:
Prostę prawda? Polecam również
przeczytać: http://msdn.microsoft.com/en-us/library/7wd6ex19.aspx
(tam znajduje się więcej informacji w tym temacie).
Bardzo pomocny artykuł
OdpowiedzUsuń