你的分享就是我们的动力 ---﹥

Silverlight实例教程 - Out of Browser与COM的交互基础

时间:2011-10-08 09:55来源:www.chengxuyuans.com 点击:

相信读过前几篇Silverlight Out of Browser实例教程的朋友已经对Silverlight的OOB应用有了一定 的认识和了解。今天,我们将讨论Silverlight Out of Browser的另外一个功能实例,Silverlight OOB 与COM API的交互操作。

在开始实例之前,我们先了解一些基本的概念。

首先说说什么是COM?

这里我不想过多篇幅的讨论COM和COM+,在微软MSDN对COM技术有详细的解释,有兴趣的可以看看。这 里我们只是对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静态类,而在Silverlight 4正 式版中,微软将ComAutomationFactory修改为AutomationFactory类。

AutomationFactory类是在System.Runtime.InteropServices.Automation命名空间下,提供四个方法 和一个属性

ComAutomationFactory.CreateObject和ComAutomationFactory.GetObject用来创建COM实例。

而ComAutomationFactory.GetEvent则是返回一个ComAutomationEvent实例,开发人员可以通过该方法 激活相关事件。

ComAutomationFactory.IsAvailable属性将返回一个布尔型,确认该COM组件是否正在被调用。

最后CreateObject<T>()暂时没有任何作用。

其简单的用法:

1 private dynamic outlook;
2
3 private bool InitializeOutlook()
4  {
5     try
6     {
7         outlook =  AutomationFactory.GetObject("Outlook.Application");
8         return true;
9      }
10     catch (Exception)
11     {
12          try
13         {
14             outlook =  AutomationFactory.CreateObject("Outlook.Application");
15              outlook.Session.GetDefaultFolder(6 /* Inbox */).Display();
16              outlook.ActiveWindow.WindowState = 1;
17             return true;
18          }
19         catch (Exception)
20         {
21              // 返回错误
22             return false;
23          }
24     }
25 }

在上面代码中,我们可以看到一个新的关键字"dynamic",该关键字是C# 4.0的新特性之一,其含义是 允许声明一个动态类型的变量,在编译时,编译器允许我们调用任何方法和属性,不会出现异常报错,而 在运行时会进行查找调用的方法和属性是否正常,如果方法或者属性存在,并且参数也正确,将会正常调 用执行,反之,则返回 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常错误。对于 dynamic关键字的详细解释和更多例程,推荐大家看看MSDN详细介绍。

在项目中使用dynamic关键字,需要添加新的引用"Microsoft.CSharp",

Silverlight 4与COM交互实例

相信读过上一篇的朋友都还记得,Silverlight 4默认的情况下仅能访问"My..."系列目录,例如“我 的文档”,“我的音乐”,“我的图片”等。而使用COM API后,Silverlight 4将会突破该限制,允许应 用访问本地任何磁盘和目录。

实例:在本地任何磁盘和目录写文件和读文件操作

在本实例中,我们仍旧使用上一篇中的项目代码SilverlightOOBDemo,对其进行简单的修改。

说到本地文件读写操作,很多人都会想到FileSystemObject类,该类提供了简单而又全面的Windows文 件操作方法,例如读文件,写文件,删文件,改文件,以及与之相同的目录操作。在MSDN中,有关于FSO 所有的方法列表供大家参考。这里我们会用到CreateTextFile,WriteLine,OpenTextFile,ReadAll等方 法实现Silverlight 4操作任何磁盘和目录写文件和读文件。

在项目中的ToolBar栏,添加新的操作按钮,

1 <Button Width="56" Height="80" Style="{StaticResource BlackGlossyButton}"  Margin="1,0,0,0" Foreground="White" x:Name="writeFileBtn"  Click="writeFileBtn_Click">
2      <Button.Content>
3          <StackPanel>
4             <Image VerticalAlignment="Top"  HorizontalAlignment="Center" Source="/SilverlightOOBDemo;component/Images/Write.png"  Margin="0,-5,0,0" Stretch="None" />
5             <TextBlock  VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,3,0,0" Text="写文件"  TextWrapping="Wrap"/>
6         </StackPanel>
7       </Button.Content>
8 </Button>
9
10 <Button Width="56"  Height="80" Style="{StaticResource BlackGlossyButton}" Margin="1,0,0,0"  Foreground="White" x:Name="readFileBtn" Click="readFileBtn_Click">
11       <Button.Content>
12         <StackPanel>
13              <Image VerticalAlignment="Top" HorizontalAlignment="Center"  Source="/SilverlightOOBDemo;component/Images/Read.png" Margin="0,-5,0,0"  Stretch="None" />
14             <TextBlock  VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="0,3,0,0" Text="读文件"  TextWrapping="Wrap"/>
15         </StackPanel>
16       </Button.Content>
17 </Button>

为了两个Button创建Click事件,writeFileBtn_Click和readFileBtn_Click。

写文件操作代码:

1 private void writeFileBtn_Click(object sender, RoutedEventArgs e)
2  {
3     using (dynamic fsoCom = AutomationFactory.CreateObject ("Scripting.FileSystemObject"))
4     {
5                  dynamic file = fsoCom.CreateTextFile(@"c:\test.txt", true);
6                  file.WriteLine("Hello Silverlight 4.");
7                  file.WriteLine("Silverlight写文件到C:\\");
8                 file.Close ();
9     }
10 }

运行OOB应用,点击“写文件”按钮,FSO将在C盘创建test文本文件,其内容如下:

而读文件代码:

1 using (dynamic fsoCom = AutomationFactory.CreateObject ("Scripting.FileSystemObject"))
2 {
3                 dynamic file  = fsoCom.OpenTextFile(@"c:\test.txt", 1, true);
4                  tbResult.Text = file.ReadAll();
5                 file.Close();
6  }

其运行效果如下:

以上都是使用FSO最基础的文件操作API实现的,依次类推,可以很轻松操作本地文件和目录。

今天Silverlight实例教程暂时介绍到这里,下一篇我将继续介绍Silverlight OOB应用与Office应用 的交互。

随文源码

转载注明地址:http://www.chengxuyuans.com/slverlight/21812.html