wtorek, 11 maja 2010

Przekierowanie wersji assembly (C# .NET) [PL]

Promuj
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).
Promuj

1 komentarz:

Posty powiązane / Related posts