wtorek, 18 maja 2010

Wtyczka w .NET 4.0 dla aplikacji .NET 2.0 [PL]

Promuj
W poprzednim post'cie pisałem o możliwości wykorzystania supportedRuntime w konfiguracji, czyli jak sprawić, by aplikacja skompilowana do obsługi pewnej wersji .NET Framework, działała pod inną wersją. W podsumowaniu zastanawiałem się, gdzie to można wykorzystać. Chciałem, by zaproponowany scenariusz wykorzystania był prawdopodobny, dlatego wymyśliłem (wydaje się dobry) przykład.
„Mamy aplikację napisaną dla .NET 2.0, która obsługuje wtyczki (plugin'y). Chcemy opracować dla niej wtyczkę, oferującą nową funkcjonalność. Z jakiegoś powodu (np. z wygody lub lepszych rozwiązań technicznych) wtyczkę chcielibyśmy przygotować w .NET 4.0. Czy nam się to uda?”
Zobaczmy przykład.
Ten przykład oparty jest o kod opisywany we wcześniejszym artykule pt. „Jak zaimplementować mechanizm wtyczek (plugin'ów) w .NET (C#)”.
Solution wygląda następująco:
Kod pliku Class1.cs jest taki sam jak we wcześniejszym artykule. Natomiast funkcja Main w Program.cs została rozbudowa o sprawdzanie wykorzystywanego .NET framework i obsługę wyjątków. Po tych zmianach wygląda następująco:
    static void Main()
    {
        Console.WriteLine(".Net Framework Version {0}",  Environment.Version.ToString());
        Console.WriteLine("Processing Plugins");
        //selecting current directory
        DirectoryInfo di = new DirectoryInfo(".");
        //checking all DLL files in the current directory that start from "Plugin"
        foreach(FileInfo fi in di.GetFiles("Plugin*.dll"))
        {
            try
            {
                //loading of the Plugin directory
                Assembly pluginAssembly = Assembly.LoadFrom(fi.FullName);
                //checking all public types from loaded assembly
                foreach (Type pluginType in pluginAssembly.GetExportedTypes())
                {
                    //now we are checking whether particular type implements 
                    //IDoSth interface
                    if (pluginType.GetInterface(typeof(IDoSth).Name) != null)
                    {
                        //creating the instance of selected type
                        IDoSth TypeLoadedFromPlugin = (IDoSth)Activator.CreateInstance(pluginType);
                        //do sht with the plugin
                        Console.WriteLine(TypeLoadedFromPlugin.DoSth());
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Cannot use plugin: {0}, the reason is: {1}", fi.Name, ex.Message);
            }
        }
        Console.ReadLine();
    }
Ponieważ aplikacja ChangeSupportFramework kompilowana jest dla .NET 2.0, a wtyczka dla .NET 4.0 po uruchomieniu otrzymamy następujący błąd:
Nie udało nam się załadować wtyczki.... Można jednak zmodyfikować plik app.config, tak by wyglądał następująco (rekompilacja nie jest potrzebna):
<?xml version="1.0"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>
Teraz w wyniku uruchomienia otrzymujemy:
Jak widać, wtyczka tym razem została wczytana i wykonała się bezproblemowo. Co więcej, aplikacja wskazała, że wykorzystała do działania nowszą wersję .NET framework.
Mam nadzieję, że w ten sposób udało mi się wskazać przydatne wykorzystanie konfiguracji supportedRuntime, a może ktoś inny ma jakiś jeszcze ciekawy przykład? (Zapraszam do pisania w komentarzach).
Promuj

1 komentarz:

Posty powiązane / Related posts