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).
Precyzyjne informacje, takie są najlepsze
OdpowiedzUsuń