
相信讀過前幾篇Silverlight Out of Browser實例教程的朋友已經對Silverlight的OOB應用有了一定的認識和了解。今天,我們將討論Silverlight Out of Browser的另外一個功能實例,Silverlight OOB與COM API的交互操作。
在開始實例之前,我們先了解一些基本的概念。
**首先說說什么是COM?**
這里我不想過多篇幅的討論COM和COM+,在微軟MSDN對COM技術有詳細的解釋,[有興趣的可以看看](http://www.microsoft.com/com/default.mspx)。這里我們只是對COM進行一個簡單的描述。所謂COM也就是Componet Object Model,中文稱為組件對象模型,通常被用于創建可復用軟件組件。在微軟的產品中,許多應用都提供了COM接口供開發人員調用。其中較為典型的是Office系列的COM接口。
對于COM和COM+的專業定義,COM是一種說明如何建立可動態互變組件的規范,此規范提供了為保證能夠互操作,客戶和組件應遵循的一些二進制和網絡標準。通過這種標準將可以在任意兩個組件之間進行通信而不用考慮其所處的操作環境是否相同、使用的開發語言是否一致以及是否運行于同一臺計算機。 而COM+可以稱為COM的一個升級版本,其底層結構仍然以COM為基礎,它幾乎包容了COM的所有內容,COM+綜合了COM、DCOM和MTS這些技術要素,它把COM組件軟件提升到應用層而不再是底層的軟件結構,它通過操作系統的各種支持,使組件對象模型建立在應用層上,把所有組件的底層細節留給操作系統,因此,COM+與操作系統的結合更加緊密。值得注意的是COM+不再局限于COM的組件技術,它更加注重于分布式網絡應用的設計和實現。
**Silverlight 4對COM的支持**
早期的Silverlight開發人員都知道,Silverlight作為客戶端技術,無法執行權限較高的操作,例如讀寫本地磁盤,執行本地命令等。Silverlight 4的發布,增加對COM的支持,允許Silverlight在OOB信任應用下,對COM API進行互操作,該功能提高了Silverlight的功能,是其應用如同Windows應用一樣,輕松操作Windows API。這里請大家注意,微軟給出的建議,Silverlight 4對于COM的支持,僅限于Windows操作系統的COM組件,暫時不能支持用戶自定義創建的COM組件,這是目前存在的局限性,不過相信隨后的Silverlight版本,會解決這個問題。
**Silverlight 4與COM交互技術基礎**
微軟為開發人員提供了相關的API,使Silverlight 4和COM交互操作開發簡單化。其要點如下:
在Silverlight 4測試版本中與COM交互類是使用[ComAutomationFactory靜態類](http://msdn.microsoft.com/en-us/library/system.windows.interop.comautomationfactory(VS.96).aspx),而在Silverlight 4正式版中,微軟將[ComAutomationFactory](http://msdn.microsoft.com/en-us/library/system.windows.interop.comautomationfactory(VS.96).aspx)修改為[AutomationFactory](http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.automation.automationfactory(VS.95).aspx)類。
AutomationFactory類是在System.Runtime.InteropServices.Automation命名空間下,提供四個方法和一個屬性

?

ComAutomationFactory.CreateObject和ComAutomationFactory.GetObject用來創建COM實例。
而ComAutomationFactory.GetEvent則是返回一個ComAutomationEvent實例,開發人員可以通過該方法激活相關事件。
ComAutomationFactory.IsAvailable屬性將返回一個布爾型,確認該COM組件是否正在被調用。
最后CreateObject<T>()暫時沒有任何作用。
其簡單的用法:
~~~
??private?dynamic?outlook;
??private?bool?InitializeOutlook()
??{
??????try
??????{
??????????outlook?=?AutomationFactory.GetObject("Outlook.Application");?
??????????return?true;
??????}
?????catch?(Exception)
?????{
?????????try
?????????{
?????????????outlook?=?AutomationFactory.CreateObject("Outlook.Application");
?????????????outlook.Session.GetDefaultFolder(6?/*?Inbox?*/).Display();
?????????????outlook.ActiveWindow.WindowState?=?1;?
?????????????return?true;
?????????}
?????????catch?(Exception)
?????????{
?????????????//?返回錯誤
?????????????return?false;
?????????}
?????}
?}
~~~
在上面代碼中,我們可以看到一個新的關鍵字"**dynamic**",該關鍵字是C# 4.0的新特性之一,其含義是允許聲明一個動態類型的變量,在編譯時,編譯器允許我們調用任何方法和屬性,不會出現異常報錯,而在運行時會進行查找調用的方法和屬性是否正常,如果方法或者屬性存在,并且參數也正確,將會正常調用執行,反之,則返回Microsoft.CSharp.RuntimeBinder.RuntimeBinderException異常錯誤。對于dynamic關鍵字的詳細解釋和更多例程,[](http://msdn.microsoft.com/en-us/library/dd264736(VS.100).aspx)[推薦大家看看MSDN詳細](http://msdn.microsoft.com/en-us/library/dd264736(VS.100).aspx)介紹。
在項目中使用dynamic關鍵字,需要添加新的引用"Microsoft.CSharp",


**Silverlight 4與COM交互實例**
相信讀過上一篇的朋友都還記得,Silverlight 4默認的情況下僅能訪問"My..."系列目錄,例如“我的文檔”,“我的音樂”,“我的圖片”等。而使用COM API后,Silverlight 4將會突破該限制,允許應用訪問本地任何磁盤和目錄。
**實例**:**在本地任何磁盤和目錄寫文件和讀文件操作**
在本實例中,我們仍舊使用上一篇中的項目代碼SilverlightOOBDemo,對其進行簡單的修改。
說到本地文件讀寫操作,很多人都會想到FileSystemObject類,該類提供了簡單而又全面的Windows文件操作方法,例如讀文件,寫文件,刪文件,改文件,以及與之相同的目錄操作。在MSDN中,有關于[FSO所有的方法列表](http://msdn.microsoft.com/en-us/library/6tkce7xa(v=VS.85).aspx)供大家參考。這里我們會用到CreateTextFile,WriteLine,OpenTextFile,ReadAll等方法實現Silverlight 4操作任何磁盤和目錄寫文件和讀文件。
在項目中的ToolBar欄,添加新的操作按鈕,

~~~
??<Button?Width="56"?Height="80"?Style="{StaticResource?BlackGlossyButton}"?Margin="1,0,0,0"?Foreground="White"?x:Name="writeFileBtn"?Click="writeFileBtn_Click">
???????<Button.Content>
??????????<StackPanel>
??????????????<Image?VerticalAlignment="Top"?HorizontalAlignment="Center"?Source="/SilverlightOOBDemo;component/Images/Write.png"?Margin="0,-5,0,0"?Stretch="None"?/>
??????????????<TextBlock?VerticalAlignment="Bottom"?HorizontalAlignment="Center"?Margin="0,3,0,0"?Text="寫文件"?TextWrapping="Wrap"/>
??????????</StackPanel>
???????</Button.Content>
??</Button>
?<Button?Width="56"?Height="80"?Style="{StaticResource?BlackGlossyButton}"?Margin="1,0,0,0"?Foreground="White"?x:Name="readFileBtn"?Click="readFileBtn_Click">
??????<Button.Content>
?????????<StackPanel>
?????????????<Image?VerticalAlignment="Top"?HorizontalAlignment="Center"?Source="/SilverlightOOBDemo;component/Images/Read.png"?Margin="0,-5,0,0"?Stretch="None"?/>
?????????????<TextBlock?VerticalAlignment="Bottom"?HorizontalAlignment="Center"?Margin="0,3,0,0"?Text="讀文件"?TextWrapping="Wrap"/>
?????????</StackPanel>
??????</Button.Content>
?</Button>
~~~
為了兩個Button創建Click事件,writeFileBtn_Click和readFileBtn_Click。
寫文件操作代碼:
~~~
??private?void?writeFileBtn_Click(object?sender,?RoutedEventArgs?e)
??{
??????using?(dynamic?fsoCom?=?AutomationFactory.CreateObject("Scripting.FileSystemObject"))
??????{
??????????????????dynamic?file?=?fsoCom.CreateTextFile(@"c:/test.txt",?true);
??????????????????file.WriteLine("Hello?Silverlight?4.");
??????????????????file.WriteLine("Silverlight寫文件到C://");
??????????????????file.Close();
??????}
?}
~~~
運行OOB應用,點擊“寫文件”按鈕,FSO將在C盤創建test文本文件,其內容如下:

而讀文件代碼:
~~~
using?(dynamic?fsoCom?=?AutomationFactory.CreateObject("Scripting.FileSystemObject"))
?{
?????????????????dynamic?file?=?fsoCom.OpenTextFile(@"c:/test.txt",?1,?true);
?????????????????tbResult.Text?=?file.ReadAll();
?????????????????file.Close();
?}
~~~
其運行效果如下:

以上都是使用FSO最基礎的文件操作API實現的,依次類推,可以很輕松操作本地文件和目錄。
今天Silverlight實例教程暫時介紹到這里,下一篇我將繼續介紹Silverlight OOB應用與Office應用的交互。
[本篇源代碼下載](http://silverlightchina.net/uploads/soft/100722/1-100H2130925.rar)
歡迎大家加入"專注Silverlight" 技術討論群:
32679955(六群)
23413513(五群)
32679922(四群)
100844510(三群)
37891947(二群)
22308706(一群)
?
?
- 前言
- Out of Browser開篇
- Out of Browser配置,安裝和卸載
- Out of Browser的自定義應用
- Out of Browser存取本地文件系統
- Out of Browser與COM的交互基礎
- Out of Browser與Office的互操作
- Out of Browser的Debug和Notifications窗口
- Out of Browser音樂播放器
- Out of Browser與COM互操作實例
- Out of Browser在線更新和Silent安裝
- Validation數據驗證開篇
- Validation數據驗證基礎屬性和事件
- Validation數據驗證DataAnnotation機制和調試技巧
- Validation服務器端異步數據驗證
- Validation客戶端同步數據驗證
- Validation用戶提交數據驗證捕獲
- Datagrid,Dataform數據驗證和ValidationSummary
- 自定義擴展Validation類,驗證框架的總結和建議
- Navigation導航框架開篇
- 理解Navigation導航框架Frame類
- 理解Navigation導航框架Page類
- Navigation導航框架URI映射機制
- Navigation導航框架傳遞參數