Tworzenie aplikacji RIA w Silverlight 5 - Integracja z systemem operacyjnym cz. 1 Udostępnij na: Facebook

Autor: Tomasz Kowalczyk

Opublikowano: 2012-09-10

Jest to kolejna część cyklu artykułów przedstawiających Silverlight 5. Tym razem omówione zostaną możliwości Framework, związane z integracją oprogramowania z systemem operacyjnym. Duża liczba nowych funkcji w Silverlight 5, dotyczących integracji powoduje, że kolejny artykuł będzie kontynuacją tego tematu.

Po przeczytaniu artykułu będziesz wiedział:

  • jak utworzyć aplikację, działającą poza przeglądarką (tryb Out-of-browser),
  • jak utworzyć aplikację, działającą w trybie zwiększonego zaufania ( tryb Elevated-trust),
  • na czym polega mechanizm Platform Invocation Services (P/Invoke) i jak z niego korzystać,
  • jak budować aplikacje wielookienkowe w Silverlight 5 (Multiple Window Support),
  • jak komunikować się z systemem plików, z poziomu aplikacji w Silverlight 5.

Wprowadzenie

Aplikacje oparte o Silverlight 5 można tworzyć również w sposób umożliwiający ich uruchomienie poza przeglądarką internetową (tryb Out-of-browser). Użytkownik może zainstalować taką aplikację, pobierając ją z sieci, podobnie jakby korzystał z mechanizmu Click-Once, w aplikacjach opartych o WinForms czy WPF. Oprogramowanie, wykorzystujące tryb OOB (Out-of-browser), może być użytkowane bez potrzeby posiadania aktywnego połączenia internetowego po stronie klienckiej. Pozwala to również na obsłużenie scenariusza, wówczas gdy użytkownik aplikacji pracuje w trybie offline.

W momencie tworzenia aplikacji OOB w Silverlight 5, programista może korzystać również z możliwości, jakie daje tryb zwiększonego zaufania (Elevated-trust). Warto również pamiętać, iż administrator systemu ma możliwość ustawienia trybu zwiększonego zaufania aplikacjom, pracującym bezpośrednio w przeglądarce (In-Browser). Wymaga to jednak odpowiednich zmian w rejestrze.

W trybie (Elevated-trust) aplikacja uruchamiana jest ze zwiększonymi uprawnieniami. Należy pamiętać, że aplikacje, uruchamiane w tym trybie, wymagają również większych uprawnień w momencie ich instalacji na stacji klienckiej.

Możliwości, jakie oferuje tryb zwiększonego zaufania w Silverlight 5 przedstawiono poniżej:

  • dostęp do lokalnego systemu plików,
  • dostęp do wybranych metod, bez wywoływania wyjątku MethodAccessException,
  • uruchomienie takich aplikacji w trybie In-Browser, po odpowiednich zmianach w systemie,
  • tworzenie dodatkowych okien aplikacji (Multiple Window Support),
  • uruchamianie bibliotek kodu niezarządzanego, dzięki mechanizmowi P/Invoke.

Mechanizm Platform Invocation Services (P/Invoke), dzięki implementacji CLI w środowisku .NET, jakim jest bezpośrednio Common Language Runtime, pozwala na uruchamianie bibliotek kodu natywnego (kod maszynowy) w środowisku kodu zarządzanego (.NET). Programista, pisząc oprogramowanie w Silverlight, ma teraz dostęp do funkcji systemowych, tj.: np. wykrycie, czy w porcie USB znajduje się nośnik danych, używanie głośnika systemowego, czy też uruchamianie wiersza poleceń. Niesie więc ze sobą szereg niezwykle ciekawych zastosowań aplikacji, tworzonych w Silverlight 5.

Implementacja

Informacja
Wszystkie kody źródłowe projektów, utworzonych w ramach artykułów, będą dostępne na tej stronie.

Aby tworzona aplikacja mogła zostać uruchomiona jako OOB, należy wybrać prawym przyciskiem myszy, po utworzeniu nowego projektu w Silverlight 5, główny projekt aplikacji. Następnie, trzeba wybrać Properties i zaznaczyć Enable running application out of the browseroraz Required elevated trust when running In-browser w zakładce Silverlight. Przedstawione to zostało na Rys. 1. Aktywacja trybu OOB.

Aktywacja trybu OOB

Rys. 1. Aktywacja trybu OOB.

Następnie, należy kliknąć przycisk Out-of-Browser Settings i zaznaczyć opcję Require elevated trust when running outside the browser. Tak jak przedstawiono to na Rys. 2. Tryb OOB ustawienia.

Tryb OOB ustawienia

Rys. 2. Tryb OOB ustawienia.

Mechanizm P/Invoke

Przykładowy projekt, dołączony do tego artykułu, pozwala na uruchomienie poleceń z poziomu aplikacji wiersza i otworzenia okna przeglądarki o podanym adresie (nazwa projektu SL5_part7_PInvoke). Efekt uruchomienia projektu zawiera Rys. 3. Mechanizm P/Invoke.

Mechanizm P/Invoke

Rys. 3. Mechanizm P/Invoke.

Przede wszystkim, należy zdefiniować, jakiego pliku kodu natywnego (bibliotekę *.dll) będzie używał program. Służy do tego atrybut [DllImport]. Następnie, trzeba określić, jakiej metody z danego pliku będzie używała aplikacja. Kolejnym krokiem i jednocześnie dobrą praktyką jest zaimplementowanie metody statycznej, której jedynym zadaniem jest wywołanie metody znajdującej się w pliku *.dll:

[DllImport("msvcrt.dll", SetLastError = true)]
        static extern int system(string command);
        public static void CommandIt(string cmd)
        {
            system(cmd);
        }

Wywołanie metody po zdarzeniu występującym poprzez przyciśnięcia komponentu Button:

private void btnClick_Click(object sender, RoutedEventArgs e)
        {
            PInvokeTest.CommandIt("cmd");
        }
Informacja
W celu ustalenia, jak powinna wyglądać prawidłowa definicja metody z konkretnego pliku *.dll, warto odwiedzić stronę, która zawiera szczegółowy opis bibliotek natywnych.

Aplikacja wielookienkowa (Multiple Window Support)

Projekt, pokazujący możliwość tej funkcji, zawiera program, działający w trybie OOB. Uruchamiając się, tworzy trzy dodatkowe okienka, zawierające komponent Button. Podczas testowania tej aplikacji warto zwrócić uwagę na fakt, że przy zamykaniu głównego okna aplikacji, zamkną się również utworzone okienka. Utworzone okienka można zamykać, niezależnie od siebie (nazwa projektu SL5_part7_MultiWind). Efekt uruchomienia projektu przedstawiony został na Rys. 4. Mechanizm Multiple Window Support.

Mechanizm Multiple Window Support

Rys. 4. Mechanizm Multiple Window Support.

W konstruktorze głównego okna aplikacji projektowej została zdefiniowana reakcja na zdarzenie Loaded, które jest wywoływane w momencie uruchamiania aplikacji:

public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

Następnie, w zdefiniowanej wyżej metodzie zdarzeniowej odbywa się wywołanie pętli, w której zostanie utworzone, z każdą jej iteracją, nowe okno aplikacji. Tak utworzone okna można przemieszczać pomiędzy kilkoma monitorami niezależnie, od położenia głównego okna aplikacji:

void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            for (int i = 1; i < 4; i++)
            {
                new Window()
                {
                    Height = 200,
                    Width = 250,
                    Top = 30,
                    Left = 50 + i*100,
                    Title = "New Windows nr: " + i,
                    Content = new Button() {Content = "Some button in content"},
                    Visibility = Visibility.Visible
                };
            }
        }

Dostęp do systemu plików

Przykładowy projekt, obrazujący możliwości aplikacji OOB w dostępie do systemu plików, zawiera program, który po uruchomieniu wyświetla formularz, składający się z dwóch pól. W pierwszym należy podać nazwę pliku tekstowego, wraz z rozszerzeniem, a w drugim zawartość tego pliku.

Po kliknięciu elementu Button, znajdującego się pod formularzem, w katalogu o nazwie sl5 ,na dysku C, zostanie utworzony plik o podanej nazwie i zawartości. Efekt uruchomienia projektu zawiera Rys.  5. Mechanizm dostępu do plików.

Mechanizm dostępu do plików

Rys. 5. Mechanizm dostępu do plików.

Poniższy kod rozpoczyna się deklaracją katalogu docelowego, w którym zostanie umieszczony plik, utworzony przez aplikację. Następnie, odbywa się sprawdzenie, czy taki katalog już istnieje w strukturze katalogów w podanym miejscu, jeśli nie, to jest on tworzony. Kolejnym krokiem jest utworzenie pliku w zdefiniowanej wcześniej lokalizacji, którego nazwa i zawartość pobierane są z formularza, znajdującego się w głównym oknie aplikacji:

var tempDir = @"c:\Temp";
            if (!Directory.Exists(tempDir))
            {
                Directory.CreateDirectory(tempDir);
            }
            var fileName = txtFileName.Text;
            var fullPath = System.IO.Path.Combine(tempDir, fileName);
            using(FileStream fs = File.Create(fullPath))
            using (StreamWriter sr = new StreamWriter(fs, Encoding.UTF8))
            {
                sr.WriteLine(txtContent.Text);
            }

Podsumowanie

W tym artykule poznaliśmy część możliwości, jakie niesie ze sobą integracja z systemem operacyjnym aplikacji, pisanych w Silverlight 5. W następnym artykule rozszerzymy tematykę rozpoczętą w tej części.