1

Тема: Передовые возможности Silverlight 4 COM+

Передовые возможности Silverlight 4 COM+

оригинал:

Cutting Edge Silverlight 4 COM+ Features


Привет ребята,
Новая возможность Silverlight 4 COM+ Automation может применяться для выполнения всевозможных операций, которые были недоступны в предыдущих версиях Silverlight. В этом посте я сделаю обзор этих возможностей, технологии COM+ Automation, некоторых связанных с этим вопросом тем, а также полезных инструментов для разработчика.

Код примеров данного материала доступен по сслыке:
http://Justinangel.net/Storage/SL4Com/SL4Com.zip

Также доступна рабочая демка:
http://Justinangel.net/Storage/SL4Com/testpage.html

Thumbs up Thumbs down

2

Re: Передовые возможности Silverlight 4 COM+

Что означает поддержка  Silverlight 4 COM+ Automation?

Silverlight 4 Beta 1 предоставляет возможность инициализировать и использовать классы COM+ из кода Silverlight. Следует отметить, что эти возможности доступны только при работе с высокими привилегиями внебраузерного режима (Out-Of-Browser) и недоступны при работе в браузере. В Silverlight 4 Beta COM+ Automation работает только в Windows (но об этом позже).

Основной функционал для работы  Silverlight 4 COM+ сосредоточен в классах ComAutomationFactory и ComAutomationEvent.

Thumbs up Thumbs down

3

Re: Передовые возможности Silverlight 4 COM+

О нет! COM+ убил во мне все хорошее еще в 90-х!

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_b8303a1c-11b8-4dfb-ae99-73a2c6427fa2.png

Расслабьтесь.

Silverlight 4 COM+ Automation не предполагает создания, развертывания или поддержку компонентов COM+, это самая плохая сторона этой технологии. Лучшей стороной Silverlight 4 COM+ является только использование доступных классов COM+ операционной системы, а не создание своих.

В таком свете вы просто являетесь потребителем некоторых проверенных временем функций Windows API. Использование функций COM+ Windows API ничем не отличается, используете ли вы .NET, другие ли фреймворки или возможности p/Invoke.

Thumbs up Thumbs down

4

Re: Передовые возможности Silverlight 4 COM+

Заканчивай трепаться и покажи как сделать Silverlight 4 OOB!

Начнем с создания нового проекта Silverlight OOB (Out Of Browser) с высокими привилегиями в Visual Studio 2010.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_0180224f-4b5e-4cac-bc0c-07ce8f4ee52d.png

Для нашего теста не нужно создавать дополнительный серверный Web-проект, но нужно удостовериться, что мы создаем именно проект Silverlight версии 4.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_97d98bae-1c70-45b9-aecc-465ca321c752.png

Правым кликом по проекту SL4Com откройте "Properties".
Поставьте галочку «Enable Running Application out of browser».

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_92c3925d-ff75-47f5-a8c4-54ac49442979.png

Для получения повешенных привилегии при работе вне браузера нажмите кнопку «Out of Browser Settings» и установите «Require Elevated Trust when running out of browser».

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_e9f65703-10ee-41a1-a5c5-2605d1786d7e.png

Затем добавьте кнопку в MainPage, по нажатию которой произойдет установка приложения вне браузера:

<Button x:Name="btnInstall" Click="btnInstall_Click" Content="Install Out-Of-Browser App" />
private void btnInstall_Click(object sender, RoutedEventArgs e)
{
    if (Application.Current.InstallState == InstallState.NotInstalled)
        Application.Current.Install();
}

Замечание: Эта статья о COM+, а не о лучших традициях написания обработчиков событий. Если бы это было реальное приложение, для поимки событий следовало бы использовать Prism Commands или Blend Behaviours.

Запустим приложение и установим его.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_4f6360f2-7d61-442b-88d4-efdc1ef9824f.png

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_78390600-5a45-436e-a655-e4437a8cb045.png

Затем укажем, что приложение должно запускать в Visual Studio 2010 в режиме Out-Of-Browser во время отладки. Откройте Project properties -> Debug -> Installed out of browser application -> SL4Com.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_41e5a911-ba6c-4912-b90c-5dc3c923e662.png

Последнее, что осталось сделать – добавить ссылку на Microsoft.CSharp.dll и мы сможем использовать новое ключевое слово dynamic из Silverlight 4.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_f3560375-b8e0-488f-a321-eedb43ceff4b.png

(на моем компьютере DLL находится в c:\Program Files (x86)\Microsoft SDKs\Silverlight\v4.0\Libraries\Client\Microsoft.CSharp.dll)

Thumbs up Thumbs down

5

Re: Передовые возможности Silverlight 4 COM+

Фича №1: Запись файла в любое место на локальных дисках

Используя FileSystemObject мы получаем практически безграничный доступ к файлам пользователя.

<Button x:Name="btnWriteFile" Content="Write file to C:\test.txt" Click="btnWriteFile_Click" />
private void btnWriteFile_Click(object sender, RoutedEventArgs e)
{
    using(dynamic fsoCom = ComAutomationFactory.CreateObject("Scripting.FileSystemObject"))
    {
        dynamic file = fsoCom.CreateTextFile(@"c:\test.txt", true);
        file.WriteLine("Bloody Hell!");
        file.WriteLine("Silverlight is writing to C:\\");
        file.Close();
    }
}

Запустив наше приложение и нажав кнопку мы увидим, что новый файл был создан в C:\test.txt.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_8573180d-e8ce-40c3-a54b-7df1b5e69333.png

Thumbs up Thumbs down

6

Re: Передовые возможности Silverlight 4 COM+

Фича №2: Чтение файла с любого диска пользователя

Методом FileSystemObject.ReadAll мы можем прочитать любой файл на машине пользователя.

<Button x:Name="btnReadFile" Content="Read file C:\test.txt" Click="btnReadFile_Click" />
private void btnReadFile_Click(object sender, RoutedEventArgs e)
{
    using (dynamic fsoCom = ComAutomationFactory.CreateObject("Scripting.FileSystemObject"))
    {
        dynamic file = fsoCom.OpenTextFile(@"c:\test.txt", 1, true);
        MessageBox.Show(file.ReadAll());
        file.Close();
    }
}

Запустив приложение и нажав кнопку мы увидим содержимое файла:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_ab487d57-f600-484d-96e6-af23327b1d16.png

Чем еще FileSystemObject может нам полезен?

Объект FileSystemObject по сути позволяет овладеть машиной пользователя. Он предоставляет возможности чтения, записи, удаления и изменения любого файла или каталога в файловой системе пользователя. Вот список методов, которые вы можете исследовать самостоятельно:

Add Method (Folders) 
BuildPath Method 
Close Method (FileSystemObject ... 
Copy Method (FileSystemObject) 
CopyFile Method 
CopyFolder Method 
CreateFolder Method 
CreateTextFile Method 
Delete Method 
DeleteFile Method 
DeleteFolder Method 
DriveExists Method 
FileExists Method 
FolderExists Method 
GetAbsolutePathName Method 
GetBaseName Method 
GetDrive Method 
GetDriveName Method 
GetExtensionName Method 
GetFile Method 
GetFileName Method 
GetFileVersion Method 
GetFolder Method 
GetParentFolderName Method 
GetSpecialFolder Method 
GetStandardStream Method 
GetTempName Method 
Move Method 
MoveFile Method 
MoveFolder Method 
OpenAsTextStream Method 
OpenTextFile Method 
Read Method 
ReadAll Method 
ReadLine Method 
Skip Method 
SkipLine Method 
Write Method (FileSystemObject ... 
WriteBlankLines Method 
WriteLine Method (FileSystemOb ... 

Thumbs up Thumbs down

7

Re: Передовые возможности Silverlight 4 COM+

Фича №3: Выполнение/Запуск любой команды или файла

Используя метод WShell Run, мы можем выполнить любую команду.

<Button x:Name="btnExecuteCmdPing" Content="Cmd Ping 127.0.0.1" Click="btnExecuteCmdPing_Click" />
private void btnExecuteCmdPing_Click(object sender, RoutedEventArgs e)
{
    using(dynamic shell = ComAutomationFactory.CreateObject("WScript.Shell"))
    {
        shell.Run(@"cmd /k ping 127.0.0.1");
    }
}

Нажатие кнопки приведет к открытию консоли CMD и выполнению заданной команды:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_66fb72d1-afda-42dd-ab01-7e8d9cc17d14.png

Thumbs up Thumbs down

8

Re: Передовые возможности Silverlight 4 COM+

Фича №5: Эмуляция пользовательского ввода

Используя метод WShel SendKeys мы можем посылать сообщения приложению, на котором стоит фокус. Эта фича очень полезна при интеграционном тестировании.

<Button x:Name="btnExecuteNotepadAndSendKeys" Content="Run Notepad and write something" Click="btnExecuteNotepadAndSendKeys_Click" />
private void btnExecuteNotepadAndSendKeys_Click(object sender, RoutedEventArgs e)
{
    using (dynamic shell = ComAutomationFactory.CreateObject("WScript.Shell"))
    {
        shell.Run(@"c:\windows\notepad.exe");
        shell.SendKeys("Justin Angel{Enter}Rocks!");
    }
}

Взглянув на синтаксис SendKeys легко догадаться, что есть специальные ключи (такие как: Enter, Tab, escape, ctrl, и т.д.), которые могут быть записаны используя специальные обозначения.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_88aae705-fd03-46c5-9edf-a5b1eaf409a6.png

Thumbs up Thumbs down

9

Re: Передовые возможности Silverlight 4 COM+

Фича №5: Прикрепление файлов к панели задач Windows 7

С помощью класса Shell.Application мы можем пробежаться по всем приложениям, получить команды (Verbs) и выполнить их. Вот команды для приложения Калькулятор:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_ef335362-3140-4c1a-bd56-cca7f926beeb.png

Этот метод позволяет нам прикрепить Калькулятор к панели задач Windows 7, даже если Калькулятор в этот момент не запущен.

<Button x:Name="btnPinCalculator" Content="Pin Calcuator to the Win7 Taskbar" Click="btnPinCalculator_Click" />
private void btnPinCalculator_Click(object sender, RoutedEventArgs e)
{
    using (dynamic ShellApplication = ComAutomationFactory.CreateObject("Shell.Application"))
    {
        dynamic commonPrograms = ShellApplication.NameSpace(23);
        string allUsersPath = 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();
            }
        }
    }
}

Вот что делает этот метод на самом деле:

1.    Получает путь ко всем ярлыками меню «Пуск».
2.    Находит ярлык Калькулятора.
3.    Проверяет команды доступные для этого ярлыка.
4.    Находит и выполняет команду «Pin to Taskbar».

Запустив приложение и нажав кнопку мы увидим, что теперь Калькулятор прикреплен к пользовательской панели задач:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_c11749a9-a017-4dd2-8a46-c7e3cbe37272.png

Thumbs up Thumbs down

10

Re: Передовые возможности Silverlight 4 COM+

Фича №6: Чтение Реестра

При помощи метода Shell.Application RegRed вы можете читать значения реестра системы. Значение ключа "HKLM\Software\Microsoft\Windows\CurrentVersion\CommonFilesDir" хранит путь к Common Files:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_07dc11e3-6524-4763-8c7f-18deac0a9e6c.png

И мы можем легко прочитать это значение методом RegRed.

<Button x:Name="btnReadRegistry" Content="Read HKLM registry" Click="btnReadRegistry_Click" /> 
private void btnReadRegistry_Click(object sender, RoutedEventArgs e)
{
    using (dynamic WShell = ComAutomationFactory.CreateObject("WScript.Shell"))
    {
        string reg = WShell.RegRead(@"HKLM\Software\Microsoft\Windows\CurrentVersion\CommonFilesDir");
        MessageBox.Show("The Program files on this machine are at: " + reg);
    }
}

Нажав на кнопку вы увидите значение этого ключа реестра:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_bbe8fea0-26e7-4ef4-a7bf-ff2f675843fc.png

Thumbs up Thumbs down

11

Re: Передовые возможности Silverlight 4 COM+

Фича №7: Добавить внебраузерное приложение Silverlight в автозапуск Windows

Используя комбинацию приемов работы с ярлыками, которую мы уже видели, и метод Sell.Application RegWrite мы можем добавить наше OOB приложение в автозапуск Windows. Любое приложение из списка реестра ключа “HKLM\Software\Microsoft\Windows\CurrentVersion\Run\”  будет запущено при загрузке компьютера. Так что если мы возьмем ярлык OOB и добавим его к этому списку в реестра, мы добавим его в автозапуск Windows.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_3f5ed1dd-394e-4894-aca1-10defc685a22.png


<Button x:Name="btnAddOOBAppToStartup" Content="Add out-of-browser application to Startup" Click="btnAddOOBAppToStartup_Click" />
private void btnAddOOBAppToStartup_Click(object sender, RoutedEventArgs e)
{
    using (dynamic ShellApplication = ComAutomationFactory.CreateObject("Shell.Application"))
    {
        dynamic commonPrograms = ShellApplication.NameSpace(11);
        string allUsersPath = commonPrograms.Self.Path;
 
        dynamic directory = ShellApplication.NameSpace(allUsersPath + @"\Programs");
        dynamic link = directory.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".lnk");
        string OOBLink = link.Path;
 
        using (dynamic WShell = ComAutomationFactory.CreateObject("WScript.Shell"))
        {
            WShell.RegWrite(@"HKLM\Software\Microsoft\Windows\CurrentVersion\Run\"
                                        + Deployment.Current.OutOfBrowserSettings.ShortName,
                                        OOBLink);
            MessageBox.Show("Please restart your machine and this application will load on startup.");
        }
    }
}

Этот фрагмент кода не так уж и сложен. Сначала мы получаем ярлык, указывающий на запущенное внебразуерное приложение (OOB) через каталог меню «Пуск». Затем добавляем путь к найденному ярлыку в параметр реестра, о котором мы говорили ранее.

После нажатия на кнопку мы увидим этот путь в реестре:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_ac9682de-b5e5-4106-8184-0bf12ce80939.png

Thumbs up Thumbs down

12

Re: Передовые возможности Silverlight 4 COM+

Фича №8: Прикрепляем Silverlight OOB приложение к панели задач Windows 7

Мы уже знаем, как получить путь ярлыка OOB приложения, и знаем как прикрепить такой ярлык к панели задач. Остается довольно простая задача объединить эти два приема для того, чтобы прикрепить Silverlight OOB приложение к панели задач.

<Button x:Name="btnPinOOBApp" Content="Pin Out-of-Browser application to Taskbar" Click="btnPinOOBApp_Click" /> 
private void btnPinOOBApp_Click(object sender, RoutedEventArgs e)
{
    using (dynamic ShellApplication = ComAutomationFactory.CreateObject("Shell.Application"))
    {
        dynamic commonPrograms = ShellApplication.NameSpace(11);
        string allUsersPath = commonPrograms.Self.Path;
 
        dynamic directory = ShellApplication.NameSpace(allUsersPath + @"\Programs");
        dynamic link = directory.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + ".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();
                MessageBox.Show("Close this application and start it up again from Win7 Taskbar");
            }
        }
    }
}

Теперь даже если OOB приложение закрыто, оно все равно отображается в панели задач Windows 7.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_a534c217-e70c-42ad-ac84-07a15fe21bff.png

Thumbs up Thumbs down

13

Re: Передовые возможности Silverlight 4 COM+

Фича №9: Озвучивание текста

Воспользовавшись встроенным в Windows SAPI-движком мы можем легко перевести Текст в Речь и даже наоборот.

Здесь мы продемонстрируем только использование класса SAPI.SpVoice для превращения текста в голос. Вы можете получше изучить пространство имен SAPI, поскольку в нем еще много разных возможностей связанных с голосовыми функциями.

<Button x:Name="btnText2Speech" Content="Use Text to Speech" Click="btnText2Speech_Click" />
private void btnText2Speech_Click(object sender, RoutedEventArgs e)
{
    using (dynamic ISpeechVoice = ComAutomationFactory.CreateObject("SAPI.SpVoice"))
    {
        ISpeechVoice.Volume = 100;
        ISpeechVoice.Speak("<rate speed=\"0\"><pitch middle=\"0\">Hello World! My HoverCraft is full of eels.");
    }
}

Нажатие кнопки действительно заставит Windows заговорить человеческим голосом. Если хотите увидеть относительно приемлемый вариант использование этой возможности, взгляните на мой Молекулярно Биологический Визуализатор ДНК. Также возможно произвести ограниченное распознавание речи используя SAPI и его класс SAPI.SpInprocRecognizer.

Thumbs up Thumbs down

14

Re: Передовые возможности Silverlight 4 COM+

Фича №10: Запуск SQL с локальной базой

Используя доступные в Windows функции ODBC мы можем легко соединиться с локальной базой и выполнить команду SQL.

Вот пример выполнения простой команды вставки SQL на локальной базе Nothwind:

<Button x:Name="btnExecuteSQL" Content="Execute SQL Insert statement" Click="btnExecuteSQL_Click" />
using (dynamic IDbConnection = ComAutomationFactory.CreateObject("ADODB.Connection"))
using (dynamic IDbCommand = 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, 'JustinLand')";
 
    IDbCommand.Execute();
}

Замечание: этот фрагмент кода не является образцом для подражания в плане использования ODBC в Silverlight. Хотя бы потому, что команды должны задаваться через параметры, а не через строку.

Если вы попробовали запустить этот код, то возможно получили следующую ошибку:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_8e93bb24-c54c-4c6d-af71-92aeca63508b.png

Поскольку у вас может не быть установленной базы данных Northwind или имя пользователя и пароль могут быть другими, вы получить то или иное исключение. Но позвольте заверить вас, что этот код отлично работает на моем компьютере!

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_53e66781-80be-4f6c-b4ba-21e0d027dc1f.png

Стоит немного поговорить о правильных методах работы касательно данного примера. Я вовсе не собираюсь защищать использование локальных операций SQL в сочетании с локальной базой данных.

Тем не менее, вполне возможно конвертировать чью-либо OR/M в ODBC. Это сделало бы синтаксис более  удобным – вроде EF/Linq2SQ1/NH. В данном случае более подходящим будет использовать ODBC.

Другой случай применения данного способа, если у конечного пользователя нет локальной базы данных. Тогда вам остается прибегнуть к использованию Access или чего-то в этом роде.

Лично я считаю, что для локального хранения данных Silverlight мы должны использовать OODB, а не ODBC.

Thumbs up Thumbs down

15

Re: Передовые возможности Silverlight 4 COM+

Фича №11: Сканеры и Камеры

Используя инфраструктуру WIA (Windows Image Acquisition (службы загрузки изображений)) мы можем автоматизировать внешние сканеры, фотоаппараты и видеокамеры. Очень много уникальный примеров (конвертирования форматов файлов, подключение к сканеру, получение изображений и т.д.) доступны на страницах WIA Samples. Одна из возможных задач заключается в обходе всех камер и сканеров локально присоединенных в данный момент к компьютеру,  а также получение их команд:

<Button x:Name="btnIterateWIA" Content="Iterate over external Cameras and Scanners" Click="btnIterateWIA_Click" />
private void btnIterateWIA_Click(object sender, RoutedEventArgs e)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("List of available external devices and commands:");
    using (dynamic DeviceManager = ComAutomationFactory.CreateObject("WIA.DeviceManager"))
    {
        var deviceInfos = DeviceManager.DeviceInfos;
        for (int i = 1; i <= deviceInfos.Count; i++)
        {
            var IDevice = deviceInfos.Item(i).Connect();
            var DeviceID = IDevice.DeviceID;
            var DeviceName = IDevice.Properties("Name").Value;
            var Commands = IDevice.Commands;
            for (int j = 1; j <= Commands.Count; j++)
            {
                var IDeviceCommand = Commands.Item(j);
                var CommandName = IDeviceCommand.Name;
                var CommandDescription = IDeviceCommand.Description;
                sb.AppendLine("    " + DeviceName + " (" + DeviceID + "), " + CommandName + ": " + CommandDescription);
                // Execute with: IDevice.ExecuteCommand(IDeviceCommand.CommandID);
            }
        }
    }
    MessageBox.Show(sb.ToString());
}

Приведенный выше код на самом деле очень прост.
1.    Мы инициализируем DeviceManager.
2.    Запрашиваем все имеющиеся DeviceInfos.
3.    Затем проходим по всем устройствам и получаем их команды.
4.    Отображаем имя устройства и имя команды.

На моем компьютере с внешней камерой и сканером выводится следующая информация:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_497d63d5-9970-4bda-b0e9-8f580b3109cd.png

Мы также можем выбрать изображение на внешнем устройстве.

<Button x:Name="btnGetExternalImage" Content="Acquire External Image from Scanner/Camera" Click="btnGetExternalImage_Click" />
private void btnGetExternalImage_Click(object sender, RoutedEventArgs e)
{
    using (dynamic CommonDialog = ComAutomationFactory.CreateObject("WIA.CommonDialog"))
    {
        dynamic imageFile = CommonDialog.ShowAcquireImage();
        if (imageFile != null)
        {
            imageFile.SaveFile(@"c:\myImage.jpg");
            MessageBox.Show("Saved c:\\myImage.jpg");
        }
    }
}

Если нажать кнопку, на моем компьютере появится следующий диалог:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_50d5e034-65a8-4ce0-b745-1b5af24d792b.png
http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_86aa95a6-94cb-46b4-8865-0a1903138877.png

И мы сможем увидеть изображение c:\myImage.jpg:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_fa06dd12-d8a2-4016-825f-0162c8f800bb.png

Thumbs up Thumbs down

16

Re: Передовые возможности Silverlight 4 COM+

Фича №13: Использование Windows 7 API определения местоположения

Location API являются частью Windows 7 и позволяют узнавать текущее GPS положение компьюетра. Если соответствующее оборудование подключено, используя Location API мы можем получить текущие широту и долготу.

<Button x:Name="btnWin7LocationAPI" Content="Activate Windows 7 Location API" Click="btnWin7LocationAPI_Click" />
private void btnWin7LocationAPI_Click(object sender, RoutedEventArgs e)
{
    using (dynamic LatLongReportFactory = ComAutomationFactory.CreateObject("LocationDisp.LatLongReportFactory"))
    {
        uint curStatus = LatLongReportFactory.Status;
        if (curStatus == (uint)4)
        {
            using (dynamic LatLongReport = LatLongReportFactory.LatLongReport)
            {
                MessageBox.Show("Latitude: " + LatLongReportFactory.Latitude + "\r\n Longitude: " + LatLongReportFactory.Longitude);
            }
        }
 
        LatLongReportFactory.ListenForReports(5000);
        ComAutomationEvent NewLatLongReportEvent = ComAutomationFactory.GetEvent(LatLongReportFactory, "NewLatLongReport");
        NewLatLongReportEvent.EventRaised += (s, args) =>
        {
            using (dynamic LatLongReport = LatLongReportFactory.LatLongReport)
            {
                MessageBox.Show("Latitude: " + LatLongReportFactory.Latitude + "\r\n Longitude: " + LatLongReportFactory.Longitude);
            }
            LatLongReportFactory.StopListeningForReports();
        };
    }
}

Код приведенный выше будет отображать текущую широту и долготу компьютера и проверять новые данные каждые 5 секунд.

Thumbs up Thumbs down

17

Re: Передовые возможности Silverlight 4 COM+

Фича №14: Использования классов из полной библиотеки .NET

Хотя это и не рекомендуется делать, вы можете воспользоваться некоторыми классам из полной библиотеки .NET. Не рекомендуется потому, что вашим приложением смогут пользоваться только те пользователи, кто установил себе весь фреймворк .NET.

Перед вами пример инициализации класса ReaderWriterLock используемый для распараллеливания нескольких читающих потоков и одного пишущего.

<Button x:Name="btnUseFullDotNet" Content="Use a class from the full .Net frameowrk" Click="btnUseFullDotNet_Click"/>
private static int foo = 0; 
private void btnUseFullDotNet_Click(object sender, RoutedEventArgs e)
{
    using (dynamic ReaderWriterLock = ComAutomationFactory.CreateObject("System.Threading.ReaderWriterLock"))
    {
        ReaderWriterLock.AcquireWriterLock(1);
        MessageBox.Show("System.Threading.ReaderWriterLock.AcquireWriterLock() - acquired lock");
        foo++;
        ReaderWriterLock.ReleaseWriterLock();
        MessageBox.Show("System.Threading.ReaderWriterLock.ReleaseWriterLock() - released lock");
        ReaderWriterLock.AcquireReaderLock(1);
        MessageBox.Show("While in reader lock - Foo value is " + foo);
        ReaderWriterLock.ReleaseReaderLock();
 
    }
}

Выполнив код, вы увидите вполне ожидаемые сообщения. Интересной фишкой тут является то, что мы используем классы из полного настольного Фреймворка .NET в то время как они недоступны в Silverlight.

Thumbs up Thumbs down

18

Re: Передовые возможности Silverlight 4 COM+

Фича №15: Использование WMI для создания наблюдателя за файловой системой (FileSystemWatcher)

Воспользовавшись классом WbemScripting.SWbemLocator мы можем выполнить WMI-запросы из Silverlight. WMI позволяет запрашивать большое кол-во информации об операционной системе, например: производительность (память и процессор), безопасность, сетевое окружение, хранилища данных, Active Directory, Kernel и т.д. В этом примере мы перестроим .NET наблюдателя файловой системы используя событи WMI.

<Button x:Name="btnActivateFileSystemWatcher" Content="Active FileSystemWatcher on C:\" Click="btnActivateFileSystemWatcher_Click" />
private void btnActivateFileSystemWatcher_Click(object sender, RoutedEventArgs e)
{
    new Thread(() =>
    {
        using (dynamic SWbemLocator = ComAutomationFactory.CreateObject("WbemScripting.SWbemLocator"))
        {
            SWbemLocator.Security_.ImpersonationLevel = 3;
            SWbemLocator.Security_.AuthenticationLevel = 4;
            dynamic IService = SWbemLocator.ConnectServer(".", @"root\cimv2");
 
            string fileSystemWatcherQuery =
                @"SELECT * FROM __InstanceOperationEvent WITHIN 3 WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent= 'Win32_Directory.Name=""c:\\\\""'";
            dynamic monitor = IService.ExecNotificationQuery(fileSystemWatcherQuery);
 
            Dispatcher.BeginInvoke(() => MessageBox.Show(@"Now listening to file changes on c:\"));
 
            while (true)
            {
                dynamic EventObject = monitor.NextEvent();
                string eventType = EventObject.Path_.Class;
                string path = EventObject.TargetInstance.PartComponent;
                Dispatcher.BeginInvoke(() =>  MessageBox.Show(eventType + ": " + path));
            }
        }
    }).Start();
}

Данный код может показаться сложным, но это совсем не так.

1.    Мы проинициализировали WbemScripting.SWbemLocator и соединились с локальной машиной, используя надлежащие настройки безопасности.
2.    Мы выполнили запрос WMI на получение любых изменений на диске C:\
3.    Когда запрашиваемое событие срабатывает, мы показываем окошко с сообщением.

Поскольку Wbem не имеет прямой поддержки событий, мы постоянно опрашиваем его. Так что весь код выполняется в фоновом потоке. Запустив этот код и создав в корне диска C:\ файл foo.txt мы увидим, что появится следующее сообщение:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_a6b5d26d-473f-4936-9f76-eafac910aeca.png

Thumbs up Thumbs down

19

Re: Передовые возможности Silverlight 4 COM+

Фича №16: Обход всех действительных ProgID

Если вы наблюдательный, то наверняка обратили внимание на магические строки при вызове метода ComAutomationFactory.CreateObject. Эти строки ничто иное, как ProgID зарегистрированных компонентов COM+. Мы можем получить список всех действительных ProgID через WMI.

<Button x:Name="btnIterateOverProgIDs" Content="Iterate over valid COM+ ProgIDs" Click="btnIterateOverProgIDs_Click" />
private void btnIterateOverProgIDs_Click(object sender, RoutedEventArgs e)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("The first 25 valid ProgIDs: ");
    using (dynamic SWbemLocator = ComAutomationFactory.CreateObject("WbemScripting.SWbemLocator"))
    {
        SWbemLocator.Security_.ImpersonationLevel = 3;
        SWbemLocator.Security_.AuthenticationLevel = 4;
        dynamic IService = SWbemLocator.ConnectServer(".", @"root\cimv2");
        dynamic QueryResults = IService.ExecQuery(
            @"SELECT Caption, Description, InprocServer32, ProgID FROM Win32_ClassicCOMClassSetting where progid is not null");
        for (int i = 1; i < 25 /*QueryResults.Count*/; i++)
        {
            string progID = QueryResults.ItemIndex(i).ProgID;
            sb.AppendLine("   " + progID);
        }
    }
    MessageBox.Show(sb.ToString());
}

Нажав кнопку, мы увидим список из первых 25 существующих классов COM+ Automation:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_2beed488-24b8-4147-93e5-21ac30e9f1ea.png

Thumbs up Thumbs down

20

Re: Передовые возможности Silverlight 4 COM+

Фича №17: Автоматизация Microsoft Office

Офис предоставляет набор классов автоматизации COM+, которые позволяют автоматизировать PowerPoint, Word, Excel, Outlook и т.д.

Об этом уже очень много написано, поэтому достаточно, если я ограничусь только ссылками на то, что уже было сказано людьми более знающими, чем я:

Silverlight 4's New COM Automation Support by Jeff Prosise (Outlook)

Silverlight 4 Rough Notes: Trusted Applications by Mike Taulty (Excel)

Silverlight 4: New features overview (Part 3) – Elevated Out-of-browser applications by Alex Golesh (Word)

Silverlight TV Episode 1: The Joys of Trusted Out-of-Browser Applications by Keith Smith & John Papa (PowerPoint)

Thumbs up Thumbs down

21

Re: Передовые возможности Silverlight 4 COM+

Инструменты для разработки COM+ в Silverlight 4

При разработке приложений Silverlight COM+ следующие 4 инструмента станут неоценимым источником информации:

1: WMI Explorer

WMI Explorer – инструмент общего назначения используется для визуализации запросов WMI (которые мы уже видели в примерах). Выполнив следующий запрос в WMI Explorer мы можем увидеть все доступные компоненты COM+ на текущей машине:

SELECT Caption, Description, InprocServer32, ProgID FROM Win32_ClassicCOMClassSetting where progid is not null

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_14f6631b-b5e0-4b47-8230-0f61340ec38e.png

Этот список будет чрезвычайно полезным при выяснении доступных ProgID для COM Automation.


2: DLL Export Viewer

При работе с динамическими типами IntelliSense не работает. Но не нужно бояться, используя DLL Export Viever мы получаем ту же самую информацию предоставляемую рефлектором.

Сначала найдите адрес файла COM+ DLL в WMI Explorer, а затем загрузите его в DLL Export Viewer:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_db6c625e-ebfc-4110-a640-34097e4fd6a5.png

Удостоверьтесь, что стоит галочка “Scan COM Type Libraries”. Теперь вы можете видеть список экспортируемых членов из ODBC DLL:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/dll_export_viewer.PNG



3: Resharper

Несмотря на то, что разработка с динамическими типами отключает IntelliSense, Resharper 5 оказывается более полезным, поскольку он предлагает IntelliSense для членов, который уже были использованы ранее.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_b375dbb1-d632-4642-a0cd-29add2f3c686.png

Обратите внимание на IntelliSense для методов «Run» и «SendKeys».



4: MSDN и поисковики

Большая часть основных Windows COM+ компонентов достаточно неплохо описана на MSDN, куда приводят некоторые запросы в google:

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_65a93e65-c560-420d-83f6-25025094970a.png

Если нужная документация на MSDN отсутствует или неправильна (что случается довольно часто) ищите по слову «CreateObject <ProgID>» и найденные примеры для VBScript могут быть легко перенесены в C#.

http://silverlight.su/data/themes/tools/COM/Silverlight4Com/image_363866cc-035e-44f7-97a2-da6336db0b8d.png

Thumbs up Thumbs down

22

Re: Передовые возможности Silverlight 4 COM+

Sergey пишет:

В оригинальной версии статьи также можно узнать, планируется ли перенос возможностей Silverlight 4 COM на Mac, Linux, и можно ли самому создавать компоненты COM.

Thumbs up Thumbs down