多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
![](https://box.kancloud.cn/2016-03-18_56eb67c435fed.png) 相信读过前几篇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命名空间下,提供四个方法和一个属性 ![](https://box.kancloud.cn/2016-03-18_56eb67c5db45e.jpg)   ![](https://box.kancloud.cn/2016-03-18_56eb67c5eb65e.jpg) 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", ![](https://box.kancloud.cn/2016-03-18_56eb67c6070e2.jpg) ![](https://box.kancloud.cn/2016-03-18_56eb67c61da54.jpg) **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栏,添加新的操作按钮, ![](https://box.kancloud.cn/2016-03-18_56eb67c63768d.jpg) ~~~   <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文本文件,其内容如下: ![](https://box.kancloud.cn/2016-03-18_56eb67c647284.jpg) 而读文件代码: ~~~ using (dynamic fsoCom = AutomationFactory.CreateObject("Scripting.FileSystemObject"))  {                  dynamic file = fsoCom.OpenTextFile(@"c:/test.txt", 1, true);                  tbResult.Text = file.ReadAll();                  file.Close();  } ~~~ 其运行效果如下: ![](https://box.kancloud.cn/2016-03-18_56eb67c658233.jpg) 以上都是使用FSO最基础的文件操作API实现的,依次类推,可以很轻松操作本地文件和目录。 今天Silverlight实例教程暂时介绍到这里,下一篇我将继续介绍Silverlight OOB应用与Office应用的交互。 [本篇源代码下载](http://silverlightchina.net/uploads/soft/100722/1-100H2130925.rar) 欢迎大家加入"专注Silverlight" 技术讨论群: 32679955(六群) 23413513(五群) 32679922(四群) 100844510(三群) 37891947(二群) 22308706(一群)