W ostatnią środę miałem przyjemność wygłosić swoją prezentację o Mono.Cecil na Krakowskiej Grupie Developerów .NET (KGD.NET). W stosunku do prezentacji na Wroc.NET postanowiłem dodać przykład pokazujący problem wczytania biblioteki z Framework’a 1.1 w aplikacji napisanej w 4.0 za pomocą System.Reflection (czemu tak się dzieje pozostaje otwarte, ale być może poruszę ten temat w innym wpisie).

W celu zaprezentowania tego posłużyłem się banalnym przykładem, który zmodyfikowałem aby wczytywał bibliotekę z .net 4.0 w celu wyjaśnienia odmienności działania. Zmodyfikowany kod wyglądał jak poniżej:

            const string assemblyName = @"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Design.dll";
            Assembly netReflection = Assembly.LoadFile(assemblyName);
            var types = netReflection.GetTypes().ToArray();
            Console.WriteLine("Types in assembly: {0}",types.Length);

            var mono = AssemblyDefinition.ReadAssembly(assemblyName);
            var monoTypes = mono.Modules.Select(x => x.GetTypes());
            Console.WriteLine("Types in assembly: {0}", monoTypes.Sum(x => x.Count()));
Niby nic nadzwyczajnego a wynik zaskoczył, bowiem po uruchomieniu na ekranie pojawił się następujący rezultat.
Zagwozdka…
Pierwszy wynik to z System.Reflection, drugi – z Mono.Cecil. Podczas prezentacji drążyć tematu nie mogłem (przykład był kodowany w trakcie sesji Gosi :)) ale oczywiście wrodzona ciekawość nie pozwoliła mi tak zostawić tego tematu. Dziś znalazłem chwilę i po małej zmianie kodu i kilku operatorów LINQ byłem w posiadaniu listy wszystkich typów do porównania.
Po wrzuceniu w difftool’a długi szukać nie musiałem, bo oto w zasadzie przy samym początku mamy różnicę (powiększenie po kliknięciu w zdjęcie):

Mono.Cecil zwrócił jako typ czego nie uświadczymy w liście z System.Reflection. Ciekawe kto tutaj ma rację. Można popatrzeć w źródła dlaczego tak się dzieje…być może, jak kiedyś czas pozwoli, zbadam temat dokładniej…na chwilę obecną miejcie na uwadze tę różnicę.


dotnetomaniak.plNajciekawsze artykuły o .NET