相信读过前几篇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应用的交互。
本篇源代码下载

转载于:https://www.cnblogs.com/kingdom_0/articles/2287196.html

OOB与COM交互读写本地文件相关推荐

  1. chrome html 读写文件路径,Chrome浏览器支持直接读写本地文件了

    本文首发于公众号:符合预期的CoyPan 写在前面 最新版的Chrome(Chrome 83, 须要开启权限)支持直接读写本地文件了.javascript 开启方法:Chrome浏览器升级到83版本以 ...

  2. java 读写文件乱码_Java 解决读写本地文件中文乱码的问题

    Java 解决读写本地文件中文乱码的问题 前言: 在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码.原因其实很简单,就是系统的编码和程序的编码采用了不同的编码格式.通 ...

  3. Android入门第50天-读写本地文件

    简介 为了这个系列,我的代码已经准备到了第150天了.接下来的内容会越来越精彩,我们也越来越开始进入Android的一些高级功能上的编程了.今天我们就要讲Android中对本地文件进行读写的全过程. ...

  4. Chrome 83 发布,支持直接读写本地文件!新的跨域策略!

    Chrome 稳定版本的更新直接跳过 v82 来到 Chrome 83,因此很多原本在 Chrome 82上就要正式发布的功能也悉数积攒到了本次更新的 Chrome 83 中. 速览 本地文件系统 新 ...

  5. Groovy里读写本地文件的几种方式

    方法1和方法2分别如下图红色和蓝色高亮所示: 其中第八行的双引号包裹起来的变量代表GString,即JavaScript和ABAP里的字符串模板. 代码: new File('c:\\temp', ' ...

  6. JavaScript创建与读写本地文件(IEFirefox)

    在IE下,可以使用ActiveXObject来实现 var fso = new ActiveXObject("Scripting.FileSystemObject"); var f ...

  7. 使用javascript读写本地文件的方法

    近期在全身心做毕业设计,我需要做的项目类似于迷宫搜索,为了显示算法运行时的效果,采用了javascript来写(使用canvas来画图). 其中一个功能是把js代码随机生成的迷宫保存到本地文件中,方便 ...

  8. js读写本地文件js读写本地文件

    1. <script language="javascript" type="text/javascript"> 2. /* 3. object.O ...

  9. VUE 读写本地文件

    代码写在JS里面 引用 const fs = require("fs"); const path = require ('path');//生成的color.less文件的位置 c ...

最新文章

  1. .NET Core开发日志——WCF Client
  2. oci连接mysql_使用 OCILIB 连接并操作 Oracle 数据库
  3. 数学系和物理系学生有什么差别?
  4. 企业网站 源码 服务邮箱:_后来才知道:温州腾讯企业邮箱定制服务
  5. Linux 中的零拷贝技术
  6. XXX packages are looking for funding run `npm fund` for details
  7. 高级网络配置:Bond网络接口、Team网络接口和网桥
  8. mysql 安装和修改编码(utf8mb4)
  9. linux 改成utc时间_深度操作系统UTC时间设置怎样改?
  10. jquery API参考手册
  11. MyBatis 自定义插件
  12. 高维球体的体积是多少
  13. 数据中台,我还能爱你吗(文末送书)
  14. Android手机平板根目录详解
  15. javascript高级程序设计读书笔记2
  16. BI学习笔记之六 - 数据仓库介绍
  17. 安装ao 服务器为空,如何在64位Windows操作系统中安装现场审计实施系统AO2011
  18. lcd12864使用c语言pic单片机,PIC单片机驱动LCD12864液晶显示闪动字体程序
  19. 换根dp(板子整理)
  20. U 盘、移动硬盘 之 Unetbootin 工具

热门文章

  1. 关于房屋的风水学整理
  2. Linux线程池的设计
  3. Pytorch(6)-设置随机种子,复现模型结果
  4. linux 虚函数调用性能,C++对象布局及多态实现探索之虚函数调用
  5. C语言return关键字
  6. java.util.IdentityHashMap.entrySet()方法实例
  7. [基础篇]ESP32-RTOS-SDK教程(一)之Windows环境搭建
  8. 获取BGR颜色的HSV值
  9. UGLY NUMBERS II
  10. 《学习opencv》笔记——矩阵和图像处理——cvAnd、cvAndS、cvAvg and cvAvgSdv