在托管代码中通过VSTO可以很方便的创建Outlook 2003的Add in,但是部署相对于开发来说为我们带来的并非同样的便捷,以下将介绍Outlook 2003托管Add in的部署的步骤以及我在使用中遇到的一些问题及解决方案。
其中大部分是来自于微软的在线视频,这里仅介绍部署部分,如果想要系统的学习,请访问微软网站以获取官方教学视频及PPT。
- 介绍一下托管Add in的工作原理。
首先,我们需要明确一点,在Outlook 2003中,Outlook是不能直接加载托管代码编写的Add in的。这就注定,用托管代码编写的Add in必须通过其他的某个东西与Outlook交互。这个东西就是VSTO中所提供的AddinLoader.dll。
Outlook 2003的Add in必须实现IDTExtensiblity2接口,这个接口在我们通过VSTO进行编程的时候基本上是不会接触到的,在运行时,AddinLoader.dll会将根据指定的托管Add in提供给Outlook 2003一个IDTExtensiblity2接口的对象。这样Outlook 2003就可以正确加载托管Add in了。
AddinLoader.dll作为桥梁沟通了Outlook 2003和运行在VSTO Runtime中的托管Add in。
同时,我们在创建Outlook外接程序项目后就可以发现,Add in项目的引用中包含Microsoft.Office.Interop.Outlook.dll这一项。在客户机器上,一般是不会存在这个文件的,这是Office PIA组件的一部分。
- 部署时的系统必备组件。
作为系统必备组建,.Net Framework 2.0就不必细说了,托管嘛。
当然,如果客户机上没有安装Outlook 2003的话,那就放弃吧……
我们已经知道,AddinLoader.dll是托管Add in运行必备的部分,而AddinLoader.dll是VSTO Runtime的一部分。因此,VSTO Runtime也是系统必备组件之一。
同时,为了是托管Add in正常工作,我们还需要为客户机安装Office PIA。
最后,根据具体的运行环境,主要是系统语言,我们需要安装VSTO语言包。如果客户机是英文版Windows则可以忽略这个组件。
- 系统必备组件
用过VS 2005做过安装程序的程序员都应该知道,VS 2005的安装程序项目可以提供系统必备组件的检查及安装,安装Outlook托管Add in所需的系统必备组件也可以通过此功能实现安装。
在默认情况下,VS 2005中所提供的系统必备组件无法满足我们的需求,这就需要我们自己动手丰衣足食了。
首先,下载三个组件的安装程序,VSTO Runtime、Office PIA、VSTO 语言包(可选)
然后,下载并安装在VS 2005中使用的VSTO系统必备组件的支持文件:Deploying VSTO 2005 Solutions Using Windows Installer Sample。
- 编译{SamplesDir}\projects\Checks\ 下的AppCheck.cpp以及PIACheck.cpp
cl.exe /Oxs /MT /GS AppCheck.cpp
cl.exe -I "C:\Program Files\Microsoft Platform SDK\Include" /Oxs /MT
/GS PIACheck.cpp "C:\Program Files\Microsoft Platform
SDK\Lib\advapi32.lib"
- 将AppCheck.exe和PIACheck.exe拷贝到{SamplesDir}\packages\Office2003PIA\ 下
AppCheck.exe :检测Office 2003应用程序是否存在
PIACheck.exe:检测Office 2003 PIA是否安装
- 将下载的vstor.exe(VSTO Runtime)拷贝到{SamplesDir}\packages\VSTORuntime
- 将下载的vstolp20.exe(VSTO语言包)拷贝到{SamplesDir}\packages\VSTOLP
- 安装Office PIA将安装后的O2003PIA.msi 拷贝到{SamplesDir}\packages\Office2003PIA中
- 将{SamplesDir}\packages\下的以上三个目录拷贝到{Bootstraper}\Packages下。{Bootstraper}的位置可以通过注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework中sdkInstallRootv2.0的值来确定。
做完以上的准备工作后,启动VS 2005,在安装项目中,我们就可以添加以上三个系统必备组件了。
- 注册表说明
在VS 2005中创建的安装项目中,我们可以发现,安装程序对注册表进行了修改,这些注册表项目是用来向Outlook 2003描述Add in的全部信息的。Outlook 2003会根据这些信息加载Add in,在这里我们可以考到,托管Add in的启动项目实际上是AddinLoader.dll。
这部分操作,我们无需做任何改动,如果不想通过默认的安装项目部署Add in,这部分操作则需要通过程序完成。如何操作注册表这里不多加描述了。
-
让客户机信任托管Add in
相对于上述几个部分来说,最常见的困扰我们的问题在于如何让客户机信任我们的Add in。
一般情况下,我们的开发环境中安装的都是.Net Framework 2.0的SDK,因此,我们可以在管理工具中找到"Microsoft .NET Framework 2.0 配置"。
在Microsoft .NET Framework 2.0 配置中,运行库安全策略节点下,我们可以设置程序集在不同范围的安全策略,默认的安装程序不会帮我们完成这部分设置。但是如果不设置必要的安全策略,Outlook 2003是不会加载托管Add in的。
- 将{SamplesDir}\projects中的SetSecurity工程添加到Outlook解决方案中
- 在安装项目中添加SetSecurity的主输出
- 在安装项目的自定义操作中添加SetSecurity的全部自定义操作
-
在安装的自定义操作的属性窗口中,设置CustomActionData属性的值
- /assemblyName="OutlookAddin.dll" /targetDir="[TARGETDIR]\"/solutionCodeGroupName="MyCompanyName.OutlookAddin" /solutionCodeGroupDescription="Code group for OutlookAddin" /assemblyCodeGroupName="OutlookAddin" /assemblyCodeGroupDescription="Code group for OutlookAddin" /allUsers=[ALLUSERS]
- 注意,这个字符串中,等号前后不能有空格
- 其中/assemblyName的值为Add in编译后的值
- 除/targetDir和/allUsers以外,其他的值都可以根据具体需要进行更改
-
设置Add in项目的程序集签名
- 在Add in项目的属性窗口中的"签名"页签添加签名文件。
至此,所有的配置都完成了。如果没有特殊情况的话,编译后的安装程序已经可以在客户机上正常安装了。
在我实际使用的过程中,遇到了一个问题。进行程序集签名后的项目,要求其所有引用的程序集必须进行签名,否则无法正常编辑。而不巧的是,我们的项目中引用的两个第三方组件没有签名,导致了无法编译。
这个问题可以通过修改SetSecurity项目中的代码解决。SetSecurity项目中使用的是强命名表示程序集,这就是要求对项目进行程序集签名的原因。而我们在"Microsoft .NET Framework 2.0 配置"中进行手动操作的时候可以发现,标识程序集的方法并非只有这一种,可以根据自己的需要选择不同的方式,当然这也意味着需要对SetSecurity中的代码有不同的修改,这里就不多写了。