Silverlight. To OOB or not to OOB
Upcoming SlideShare
Loading in...5
×
 

Silverlight. To OOB or not to OOB

on

  • 2,599 views

Eugenie Zharkov speech at Ciklum .NET Saturday (Kharkov 21.05.2011)

Eugenie Zharkov speech at Ciklum .NET Saturday (Kharkov 21.05.2011)

Statistics

Views

Total Views
2,599
Views on SlideShare
2,599
Embed Views
0

Actions

Likes
0
Downloads
2
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Silverlight. To OOB or not to OOB Silverlight. To OOB or not to OOB Presentation Transcript

    • Silverlight. To OOB or not to OOB
      Евгений Жарков
      Silverlight MVP/MCTS
    • Silverlight
      Windows Phone 7
      ПК
      Браузер
      Вне браузера
    • Out of browser (OOB)
      Управление окном
      Настройка внешнего вида окна
      Размещения HTML внутри приложения
      Окна уведомлений
      Digital Rights Management (DRM)
      Расширенные права
      Доступ к файловой системе
      COM
      Интегрированная возможность обновления
    • Активация OOB
    • КонфигурацияOOB
    • Инсталляция
      Довели до ума
    • Установка доверенных приложений
    • Подпись XAP
    • Тихая установка XAP
      Инсталляция
      /install:"xapFile" – where xapFile is the file name/file path to the .xap file., E.g. /install:"c:tempsample.xap"
      /origin:"xapURI" – where xapURI is the URI where the .xap file would've come from if not installed at the commandline
      e.g. /origin:"http://example.com/sample.xap" .  This URI will be used as the site of origin for security purposes. For example, for sandboxed applications, Silverlight networking requires a policy file check when making network requests to domains other than the site of origin.  The origin also serves as a unique ID for the application.  The xapURI must be an absolute URI not a relative URI, and must start with http:, https:, or file:.
      /overwrite -- (optional) Overwrites any previously installed .xap with that xapURI.
      Деинсталляция
      /uninstall  – Uninstalls the application specified in /origin. This is the same /origin value that was used to install the app originally.
      /origin:"xapURI" – same as /origin for the install case
    • Тихая установка XAP
      Установка
      sllauncher.exe
      /install:"{LocalPathToXapFile}Yourfile.xap"
      /origin:"{urltoxapfile}/Yourfile.xap"
      /shortcut:desktop+startmenu
      Автозапуск
      "%ProgramFiles%Microsoft Silverlightsllauncher.exe"
      /emulate:"Yourfile.xap"
      /origin:"http://blabla.com/Yourfile.xap"
      Деинсталляция
      "%ProgramFiles%Microsoft Silverlightsllauncher.exe"
      /uninstall
      /origin:"http://blabla.com/Yourfile.xap"
    • Тихая установка Silverlight
      /q- quiet install or upgrade. This installs or upgrades Silverlight without seeing the GUI. When Silverlight is installed quietly, by default privacy related features such as DRM protected media playback and the Silverlight auto-update feature will be configured to prompt the user for permission on 1st use of the respective features. The Silverlight auto-update feature requires administrative rights so non-admin users will not be prompted.
      /doNotRequireDRMPrompt - turns off the 1st use prompt allowing content protected by Digital Rights Management (DRM) to play without requiring any end-user intervention. When Silverlight is installed quietly, DRM Playback is set to prompt on 1st use by default.
      /ignorewarnings - non-fatal warnings will not be reflected in the quiet installer return code but will instead return zero indicating success.
      /noupdate - disables the Silverlight internal auto-updater.
      /qu - quiet uninstall. This uninstalls Silverlight without seeing the GUI.
    • Тихая установка Silverlight
      Результирующая строка
      Silverlight.exe /q /doNotRequireDRMPrompt
    • NSIS Script Example
      Name “Test Out of Browser Installer"
      OutFile “TextOOBInstaller.exe"
      InstallDir "$PROGRAMFILESTestOOB"
      XPStyle on
      Section
      SetOutPath "$INSTDIR"
      SetOverwriteifnewer
      File "Silverlight.exe"
      ExecWait "$INSTDIRSilverlight.exe /q /doNotRequireDRMPrompt"
      File “TestOOB.xap"
      ExecWait '"$PROGRAMFILESMicrosoft Silverlightsllauncher.exe" /install:"$INSTDIRTestOOB.xap"
      /origin:"http://blabla.com/TestOOB.xap"
      /shortcut:desktop+startmenu'
      SectionEnd
    • Batch Script
      :: Is this a 64-bit machine?
      @echo off
      if exist "%ProgramFiles(x86)%" (
      :: We're on 64-bit
      set sllauncherlocation="%ProgramFiles(x86)%Microsoft Silverlightsllauncher.exe"
      ) else (
      ::We're on 32-bit
      set sllauncherlocation="%ProgramFiles%Microsoft Silverlightsllauncher.exe"
      )
      :: run SL
      %sllauncherlocation% /overwrite /emulate:“TestOOB.xap" /origin:"http://blabla/TestOOB.xap"
    • Мои документы
      我的文件
      My Documents
      EigeneDateien
      Mes documents
      Documents
      Мои документы
      Τα έγγραφά μου
    • Batch Script User Folder
      Извлекаем правильный адрес директории “Мои документы” из реестра
      FOR /F "tokens=3 delims= " %%G IN ('REG QUERY "HKCUSoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders" /v "Personal"') DO (SET docsdir=%%G)
    • Многоязычный интерфейс
      Добавление поддерживаемых культур в файл проекта
      <?xmlversion="1.0"encoding="utf-8"?>
      <ProjectToolsVersion="4.0"DefaultTargets="Build"xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
      <ConfigurationCondition=" '$(Configuration)' == '' ">Debug</Configuration>
      <PlatformCondition=" '$(Platform)' == '' ">AnyCPU</Platform>
      <!– настройки -->
      <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
      <SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
      <SilverlightApplication>true</SilverlightApplication>
      <SupportedCultures>en-US,ru-RU,uk-UA</SupportedCultures>
      <XapOutputs>true</XapOutputs>
    • Многоязычный интерфейс
      Добавляем ресурсы с локализованным текстом
    • Многоязычный интерфейс
      Установить модификатор доступа в Public
    • Многоязычный интерфейс
      Регистрация ресурса
      <Application
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:local="clr-namespace:MyApplication"
      x:Class=“MyApplication.App">
      <Application.Resources>
      <local:LocalizationResource x:Key="Localization" />
      </Application.Resources>
      </Application>
    • Многоязычный интерфейс
      Регистрация ресурса
      publicclassLocalizationResource : INotifyPropertyChanged
      {
      privatestaticLocalization.Strings resource = newLocalization.Strings();
      publicLocalization.Strings Strings
      {
      get { return resource; }
      set { OnPropertyChanged("Strings"); }
      }
      #regionINotifyPropertyChanged Members
      publiceventPropertyChangedEventHandlerPropertyChanged;
      privatevoidOnPropertyChanged(stringpropertyName)
      {
      if (PropertyChanged != null)
      {
      PropertyChanged(this, newPropertyChangedEventArgs(propertyName));
      }
      }
      #endregion
      }
    • Многоязычный интерфейс
      Переключение языка UI
      Thread.CurrentThread.CurrentUICulture = newCultureInfo("uk-UA");
      ((LocalizationResource)Application.Current.Resources["Localization"]).Strings = newMyApplication.Localization.Strings();
    • COM
      Подключаем пространство имен
      usingSystem.Runtime.InteropServices.Automation;
      Создаем файлы в любом месте на ПК
      using (dynamicfsoCom = AutomationFactory.CreateObject("Scripting.FileSystemObject"))
      {
      dynamic file = fsoCom.CreateTextFile(@"c:test.txt", true);
      file.WriteLine("Bloody Hell!");
      file.WriteLine("Silverlight is writing to C:");
      file.Close();
      }
    • COM
      Пиним приложение на панель задач
      using (dynamicShellApplication = ComAutomationFactory.CreateObject("Shell.Application"))
      {
      dynamiccommonPrograms = ShellApplication.NameSpace(23);
      stringallUsersPath = commonPrograms.Self.Path;
      dynamic directory = ShellApplication.NameSpace(allUsersPath + @"Accessories");
      dynamic link = directory.ParseName("Calculator.lnk");
      dynamic verbs = link.Verbs();
      for (int i = 0; i < verbs.Count(); i++)
      {
      dynamic verb = verbs.Item(i);
      if (verb.Name.Replace(@"&", string.Empty).ToLower() == "pin to taskbar")
      {
      verb.DoIt();
      }
      }
      }
    • COM
      Добавляем OOB-приложение в автозагрузку
      using (dynamicShellApplication = ComAutomationFactory.CreateObject("Shell.Application"))
      {
      dynamiccommonPrograms = ShellApplication.NameSpace(11);
      stringallUsersPath = commonPrograms.Self.Path;
      dynamic directory = ShellApplication.NameSpace(allUsersPath + @"Programs");
      dynamic link = directory.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk");
      stringOOBLink = link.Path;
      using (dynamicWShell = ComAutomationFactory.CreateObject("WScript.Shell"))
      {
      WShell.RegWrite(@"HKLMSoftwareMicrosoftWindowsCurrentVersionRun"
      + Deployment.Current.OutOfBrowserSettings.ShortName,
      OOBLink);
      MessageBox.Show("Please restart your machine and this application will load on startup.");
      }
      }
    • COM
      Работа с ODBC
      using (dynamicIDbConnection = ComAutomationFactory.CreateObject("ADODB.Connection"))
      using (dynamicIDbCommand = ComAutomationFactory.CreateObject("ADODB.Command"))
      {
      IDbConnection.ConnectionString = "driver={SQL Server};"+ "server=.;uid=sa;pwd=password;database=Northwind";
      IDbConnection.Open();
      IDbCommand.ActiveConnection = IDbConnection;
      IDbCommand.CommandText =
      @"INSERT INTO [Northwind].[dbo].[Region]
                         ([RegionID], [RegionDescription]) VALUES (10, 'BLa')";
      IDbCommand.Execute();
      }
    • Тихая установка MSSQL
      Express
      sqlexpr32.exe -q /norebootchk /qnREBOOT=ReallySuppressINSTANCENAME="name" ADDLOCAL=ALLSECURITYMODE=SQL SAPWD="password" SQLAUTOSTART=1 DISABLENETWORKPROTOCOLS=0
      Compact Edition
      msiexec /quit /i SSCERuntime-ENU-x86.msi
    • Silverlight COM Toolkit
      http://silverlightcom.codeplex.com/
    • Silverlight COM Toolkit
      Copy
      ComToolkit.IO.File.Copy(@"c:AnyDirAnyFile.ext", @"c:AnyDirAnyFile2.ext", true);
      Exists
      bool exist = ComToolkit.IO.File.Exists(@"c:AnyDirAnyFile.ext");
      WriteAllBytes
      string[] contents = //some lines of text...ComToolkit.IO.File.WriteAllLines(@"c:AnyDirAnyFile.ext", bytes);
      Open
      AdoFileStream stream = ComToolkit.IO.File.Open(@"c:AnyDirAnyFile.ext", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite);
      http://silverlightcom.codeplex.com/
    • Silverlight COM Toolkit
      ComToolkit.Data
      stringconnectionString = @"Provider=SQLOLEDB;DataSource=servernamesqlexpress;InitialCatalog=databasename;User ID=username; Password=password";
      using (var connection = newComToolkit.Data.AdoConnection(connectionString)) {
      connection.Open();
      varcommand = connection.CreateCommand();
      command.CommandText= "SELECT MyColumn FROM MyTable";
      varreader = command.ExecuteReader();
      while(reader.Read()) {
      objectbyindex = reader[0];
      objectbystring = reader["MyColumn"];
      //для работы с динамическими свойства reader должен быть объявлен
      как dynamic
      //object bydynamic = reader.MyColumn;
      } }
      http://silverlightcom.codeplex.com/
    • Silverlight COM Toolkit
      Асинхронный ComToolkit.Data
      privateComToolkit.Data.AdoConnection connection;
      privatevoidExecuteReaderAsyncSample() {
      connection = newComToolkit.Data.AdoConnection(connectionString);
      connection.Open();
      varcommand = connection.CreateCommand();
      command.CommandText= "SELECT MyColumn FROM MyTable";
      command.ExecuteReaderCompleted+= new
      EventHandler<ComToolkit.Data.ExecuteReaderCompletedEventArgs>(command_ExecuteReaderCompleted);
      command.ExecuteReaderAsync(); }
      voidcommand_ExecuteReaderCompleted(object sender, ComToolkit.Data.ExecuteReaderCompletedEventArgs e) {
      //TODO: обрабатываем результат
      }
      http://silverlightcom.codeplex.com/
    • Работа с документами
    • XML Paper Specification(XPS)
      Позитивные факторы
      В основе лежит ZIP, XML, XAML. Разработан Microsoft и Ecma International, 2006 год
      Возможность относительно легкой конвертации в XAML
      Родная поддержка в Windows Vista/7
      Негативные факторы
      Windows XP SP2 требует наличие .NET Framework 3 иXPS Document Viewer
    • PDF
      Позитивные факторы
      Бесплатные компоненты для обработки PDF-документа
      Возможность разместить документ в WebBrowserпри наличии Adobe Acrobat плагина
      Негативные факторы
      Платные компоненты для обработки и отображения в Silverlight-приложении
    • HTML
      Позитивные факторы
      Возможно разместить внутри элемента управления WebBrowser
      Негативные факторы
      Невозможно открывать локальные файлы внутри WebBrowser
      Невозможно задать заголовочную информацию в WebBrowser
      Невозможно открыть MHT-файлы
      Следует собирать все ресурсы в единый HTML-файл, включая изображения, используя Data URI, который имеет ограничение в 32КБ
    • Microsoft Office (Word, Excel, PowerPoint)
      Позитивные факторы
      Работа с документами через COM
      Негативные факторы
      Отсутствует родная поддержкав Silverlight
    • Microsoft Office (Word, Excel, PowerPoint)
      Пример обработки Word документа
      using(dynamic word = AutomationFactory.CreateObject("Word.Application"))
      {
      intwdFormatWebArchive = 9; // MHT fileformat
      intwdDoNotSaveChanges = 0; // WdSaveOptions do not save value
      using(dynamic document = word.Documents.Open(tempDoc))
      {
      document.SaveAs("C:t.doc", refwdFormatWebArchive);
      }
      word.Quit(refwdDoNotSaveChanges);
      }
    • События Office
      Пример обработки Word документа
      dynamic word = AutomationFactory.CreateObject("Word.Application");
      word.Visible = true;
      AutomationEventsearchEvent = AutomationFactory.GetEvent(word, "Quit");
      searchEvent.EventRaised += (s, a) =>
      {
      MessageBox.Show("Quit");
      };
      dynamic document = word.Documents.Open("C:test.doc");
    • Потоки и BackgroundWorker
      varbw = newBackgroundWorker();
      bw.WorkerReportsProgress = true;
      bw.DoWork+= (s, a) => {
      varworker = sender asBackgroundWorker;
      worker.ReportProgress(0, "Сейчас начнем");
      MessageBox.Show("Работаем");
      worker.ReportProgress(100, «Закончили");
      };
      bw.ProgressChanged+= (s, a) =>{
      MessageBox.Show("Current state" + a.ProgressPercentage.ToString());
      // сложные объекты могут передаваться в e.UserState
      };
      bw.RunWorkerCompleted+= (s, a) => {
      MessageBox.Show("Done");
      };
      bw.RunWorkerAsync(newDictionary<string, object> {
      { "file", "test.doc"},
      { "region", "Ukraine"}
      });
    • Navigation Framework
      Подключение пространства имен в XAML
      <UserControl
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
      xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation">
    • Navigation Framework
      Добавление Frame
      <navigation:Frame x:Name="ContentFrame" Source="/Action">
      <navigation:Frame.UriMapper>
      <uriMapper:UriMapper>
      <uriMapper:UriMapping Uri=""MappedUri="/Pages/Action.xaml"/>
      <uriMapper:UriMapping Uri="/{pageName}"MappedUri="/Pages/{pageName}.xaml"/>
      </uriMapper:UriMapper>
      </navigation:Frame.UriMapper>
      </navigation:Frame>
      Переход на другую страницу
      NavigationService.Navigate(newUri("/INeedThisPage", UriKind.Relative));
    • Управление окном
      Ограничение размера окна
      // App.xaml
      privatevoidApplication_Startup(object sender, StartupEventArgs e)
      {
      this.RootVisual= newMainPage();
      App.Current.Host.Content.Resized += (s, a) =>
      {
      App.Current.MainWindow.Height = 650;
      App.Current.MainWindow.Width = 1000;
      };
      }
      Развернуть окно
      App.Current.MainWindow.WindowState= WindowState.Maximized;
    • Notification Window
      var block = newTextBlock();
      block.Text = "Wassup!";
      varnw = newNotificationWindow();
      nw.Height = 50;
      nw.Width = 300;
      nw.Content = block;
      nw.Show(3000);
    • Хочу работать с архивами
      http://slsharpziplib.codeplex.com/
      ZipOutputStreamzipOutStream = newZipOutputStream(File.Create("my.zip"));
      ZipEntryfileZipEntry = newZipEntry(name);
      zipOutStream.PutNextEntry(fileZipEntry);
      FileStreamfileStream= File.Open(filePath, FileMode.Open);
      byte[] buffer = newbyte[fileStream.Length];
      fileStream.Read(buffer, 0, buffer.Length);
      zipOutStream.Write(buffer, 0, buffer.Length);
      zipOutStream.CloseEntry();
    • Silverlight 5
    • Поздравляю, вы пережили этот доклад
      Вопросы
      ?
      Слушай подкаст
      2Гига
      Евгений Жарков
      eu.zharkov@gmail.com
      @2j2e