VSTO为我们提供了使用托管代码来开发office扩展到桥梁,它大大提供了开发office扩展到效率缩短了开发周期,并且提供了部署方案。
本文重点是介绍office插件的部署,因此这里就不介绍office插件的开发方法及过程了,首先,先介绍一下VS提供的office插件部署方案。
当我们使用vs 2008开发Office插件时,vs会自动为我们生成一该setup项目,如图1, ExcelAddIn插件项目及其部署项目。其中部署项目为我们准备好了安装插件所需要的dll文件,要写入注册表的键值(图2),该部署文件甚至可以自动检查系统是否安装了VSTO Runtime,PIA2003或PIA2007、.net framework等。
图1. ExcelAddIn插件项目及其部署项目
图2 默认写入的注册表键值
但是只要以上设置还不足以正常运行office插件,因为用户需要运行该插件代码或程序集的权限,因此这里需要将插件的程序集设为完全信任的,可以通过Microsoft .NET Framework Wizard和Caspol.exe来进行设置,前者是图形化界面但需要.NET SDK,后者是命令行界面。两者的使用方法参见:http://www.cnblogs.com/chenxizhang/archive/2008/09/08/1286598.html。因为前者在使用上需要安装sdk,而且不适合在部署时使用,因此一般在设置office插件程序集权限时使用Caspol.exe命令。该命令可以设置一个或多个程序集或文件夹授予完全信任权限,因此如果程序集多的话,并且确定程序集的位置为可信任的位置的话,完全可以将整个程序集所在的文件夹的权限设为完全信任的,而且其子文件夹及其中的所有程序集都是完全信任的。如:
Caspol –u –ag All_Code –url “C:/Test/ExcelAddIn.dll” FullTrust –n “Test”
在部署包中就需要执行上面的代码或脚本。通过上面的设置将部署包发布就可以满足大部分人都需求了。
为什么说可以满足大部分人都需求呢,因为上面的设置我们可以看到,office插件的注册是写到HKEY_CURRENT_USER键下的,而该键只对当前用于有效,因此插件只能是插件的安装者才有可能使用。如果换了其他用户B的话,那么我们在B登录系统的情况下,可以查一下HKEY_CURRENT_USER注册表信息,发现根本没有插件的影子。这就使得B根本不可能使用插件。
那么如何解决一人安装多个用户使用的目的呢?
既然是HKEY_CURRENT_USER键是针对当前用户有效,那么HKEY_LOCAL_MACHINE是保持机器级别的设置的,那么是不是把office插件的注册表键值都写到这个键下面是否就可以了呢。拿另一个WORD插件为例,如图3. Word插件的键值,同时也要将原本写到HKEY_CURRENT_USER/Software/Classes下面的键值改成HKEY_LOCAL_MACHINE/SOFTWARE/Classes下面。当前的机器环境是只安装了Office 2003,发现这样做完全可以解决多用户访问的问题。但是安装到office 2007的机器上时就出现问题了,依然无法使用,菜单也出不来。COM加载项中确实有,但总是显示已卸载。并且在office 2003的机器上将插件卸载后,即将HKEY_LOCAL_MACHINE下相关注册表信息都清楚掉后,administrator(安装插件用户)下打开word后,就看不到插件的菜单栏,并且com加载项中也没有该插件项 了,但其他用户却还可以看到插件的菜单,只是无法使用(点击按钮失效),检查注册表没有找到任何线索。
图3 word插件的键值
Office 2007使用另一种解决方案,该解决方案就是利用了HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/12.0/User Settings键。该键的神奇之处就在于他可以将其下面的注册表信息复制到当前用户下。如HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/12.0/User Settings下创建GWordAddIn子键并添加Count(REG_DWORD)=1的值,然后在下面创建Create子键,Create的子键就是关键点了,如图4. Office User Settings键,Create的子键就是要复制到HKEY_CURRENT_USER下的所有键值。将要注册的键值全部写到Create下后,然后使用当前用户打开word后,然后重新打开注册表,就可以在HKEY_CURRENT_USER下看到相应的键值来,并且word插件的菜单也出现了。然后在切换用户到B,先看看B的HKEY_CURRENT_USER下是否有对于的注册表信息,然后打开word,看看是否出现了word插件的菜单。
图4. Office User Settings Create键
卸载
如果使用这种复制方式来使得多用户使用word插件的话,那么使用原来的卸载方式就卸载不干净了,至少注册表就可能清理不干净。既然office user settings键可以使用Create提供了复制机制,那么相应的他还提供了使用Delete来实现删除机制。当需要删除注册表的注册信息时,就需要将Create键删除,然后创建Delete键,同Create的子键一样,Delete的子键就是要删除的所有HKEY_CURRENT_USER下的对应的注册表键了。仅仅添加Delete键还不行,需要修改GWordAddIn的Count键值为2.这样当用户打开word时,发现LOCAL_MACHINE下的GWordAddIn的Count值和CURRENT_USER下的GWordAddIn的Count值不同,那么office就会执行Delete操作了。这样就完成了卸载工作,当然这个User settings/GWordAddIn/Delete键就要永远保留了。
图5 卸载Delete键
另外这种方式也会出现office 2003卸载的问题,就是卸载后,administrator是看不到插件菜单里,COM加载项中也没有,但其他用户却始终存在,但是按钮失效,并且COM加载项中显示“已卸载”。
参考:
《zz将 VSTO 插件部署给所有用户》http://www.cnblogs.com/end/archive/2009/07/10/1520798.html
《如何简单部署用VSTO SE 2005开发的Excel,Word插件》http://blog.youkuaiyun.com/v_jzho/archive/2007/12/19/1954454.aspx