自Office 2010版本开始有了32位和64位之分,对Excel来说,32位的Excel和64位的Excel在性能上的主要区别是64位的Excel能够处理2G及2G以上的大数据集。

随着64位操作系统的安装,Office 2010及以上版本的普及以及计算机的内存容量越来越高,使用64位Excel的用户越来越多,所以让插件支持64位Excel能够赢得一部分用户。前面十篇文章中所讲解的技术适用于不同版本和不同位数的Excel,但是由于32位的COM组件不支持64位的Excel,所以在针对不同位数的Excel的编译和部署的时候,有些地方可能需要注意和有所不同。

64位版本的Office只能安装在64位的操作系统之上,32位的Office采用Windows-32-on-Windows-64 (WOW64) 技术可以安装在64位操作系统上,这也是32位Office在64位操作系统上的默认安装方式,同时基于32位的Office插件也可以运行在安装在64位操作系统上的32位的Office。WOW64 使用x86的模拟器能够使得基于32位Windows的应用程序可以无缝的运行在64位的操作系统上。

本文首先讲解如何检测用户机器上Excel的版本,然后介绍Shared Add-ins插件编译的时候针对不同版本的注意事项,最后介绍部署的时候需要注意的问题。

如何判断用户Excel的位数

在Excel 2010中开始菜单->帮助中有Excel的版本信息:

在Excel 2013中开始菜单->帐户->关于Excel下点开之后也有版本信息:

以上是直接查看Excel的版本,当在客户机器上通过代码部署插件的时候,可能需要通过注册表信息来诊断用户当前安装的Excel版本。

如果安装了64位版本的Office,那么可以通过Outlook的注册表节点下的名为Bitness的类型为REG_SZ的注册表项的值来判断版本信息,该值有x86和x64,说明了版本信息,不管用户安装与否Outlook,均有该节点,一般的我们查找对应Office版本的位数信息(11-Office2003,12-Office2007, 14-Office2010, 15-Office2013)。

  • 注册表项位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook

  • 注册表键: Bitness
  • 注册表值: x86 或者x64

通过代码读取注册表该项下的改注册表的值即可判断Office的版本。

为64位Office编译程序集

如果采用Shared Add-ins技术来为Excel开发插件,程序集实际上是编译为了COM组件。默认情况下,我们的编译目标设置为了Any CPU,但是对于要注册为Com组件的程序来说,Any CPU并不能支持64位的Excel,所以我们需要明确指定为x64。所有用到COM组件的,如UDF函数库,RTD函数,TCP的应用程序集都需要编译为x64并且注册为COM组件。

浅谈Excel开发:八 Excel 项目的安装部署 这篇文章中已经说过,当勾选了注册为COM组件的时候,Visual Studio实际上是在生成完了dll之后帮我们调用了regasm来注册改dll为Com组件(如果是采用C++或者其他非托管编程语言编写的dll,则需要使用regsver32 这个应用程序来注册)

regasm "D:/YYUDF/YYAddIn/YYSharedAddin/bin/Debug/YYSharedAddin.dll" /codebase /s

regasm和regsver32都有对应的32位和64位版本,在最新的Visual Studio 2013中,软件会帮我们自己选择正确的版本,但是在之前的版本中,如果您选择编译为x64并且注册为COM组件,编译的时候可能会出现如下 “xxx.dll不是有效的应用程序集”的错误:

这是由于Visual Studio没有为我们选择正确的注册工具regasm或者regsver32的版本。可以在项目的编译属性->Build Events->的Post-build event command line中输入如下:

"%Windir%\Microsoft.NET\Framework64\v2.0.50727\regasm" "$(TargetPath)"

该命令指定了使用64位的regasm来注册我们编译好的dll。

同样,如果您使用的是非托管语言编译的dll,那么regsver32也需要指定为正确的版本,方法同上。

三 64位Excel插件的部署

部署插件的时候,我们应该预先分别为32位和64位分别是使用x86和x64编译两套dll,以及打包32位和64位的regasm(如果使用非托管语言则是regsver32),然后在客户机器上部署的时候,首先判断用户安装的Excel版本,然后在分别使用对应版本的注册COM组件工具regasm来注册对应版本的dll。

四 结论

本文讲述了32位和64位Excel的差别,以及如何检测用户机器上Excel的版本,然后介绍Shared Add-ins插件编译的时候针对不同版本的注意事项,最后介绍部署的时候需要注意的问题,来了解这些之后,我们写出来的插件就可以针对各种位数的Excel插件了。希望本文对您处理不同位数的COM组件注册一些Excel 64位插件的安装部署有所帮助。

浅谈Excel开发:十一 针对64位Excel的插件的开发和部署的更多相关文章

  1. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  2. 64位Ubuntu14.04搭建ADT开发环境

    本来放假是要出去玩的,结果出游计划拖到了周一,今天先来无事看看ubuntu最近发展得怎么样了,顺便把ADT也搭建好,方便以后研究android框架.想想在windows下,ADT直接down下来解压就 ...

  3. 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)

    应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...

  4. excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution

    当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...

  5. vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法

    一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C+ ...

  6. c# excel 读写 64位操作系统 64位excel

    用c#读写excel时,会出现 “本机未注册Microsoft.ACE.OLEDB.12.0 驱动(什么的,忘了)” 读写 64位的excel 时,要在项目属性里改一下目标平台,默认的为*86, 改为 ...

  7. ubuntu 14.04 64位使用google官方android开发集成工具adt-64位无法使用adb

    在使用ubuntu64位(14.04)时,下载来一个adt-bundle-linux-x86_64-20131030.zip,但是运行时报错: Android: Gradle: Execution f ...

  8. 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包

    Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...

  9. 浅谈Redis的基本原理和数据类型结构的特性和应用开发场景

    一.Redis介绍 1,redis介绍(Redis安装在磁盘:Redis数据存储在内存) redis是一种基于键值对(key-value)数据库,其中value可以为string.hash.list. ...

随机推荐

  1. 特征描述算子-sift

    特征描述算子-sift http://boche.github.io/download/sift/Introduction%20to%20SIFT.pdf

  2. 在IIS8.5的环境下配置WCF的Restful Service

    今天在客户的环境中(Windows Server 2012 R2 + IIS 8.5)搭建Call WCF Restful Service的功能,发现了几个环境配置的问题,记录如下: 1):此环境先安 ...

  3. linux下tar安装mysql

    >>>>>>>>>>>>>>>>>>>> 到官网下载 mysql-5.6.12- ...

  4. 转:看看 Delphi XE2 为 VCL 提供的 14 种样式

    http://www.linuxso.com/linuxbiancheng/8889.html 其实只提供了 个 vsf 样式文件, 还有默认的 Windows 样式, 共 种. 在空白窗体上添加 L ...

  5. 普林斯顿算法课第四周作业_8Puzzle

    作业地址:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html 作业难点: 1.如何求一个Puzzle的解? 根据作业提示,使 ...

  6. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  7. 遍历datatable的方法

    +方法一:DataTable dt = dataSet.Tables[0];for(int i = 0 ; i < dt.Rows.Count ; i++){string strName = d ...

  8. 初探javascript

    javascript是一种在网络广泛应用的脚本语言,虽然名字与java相近,但其实两者并没有直接的关系,脚本语言是一种为了便于操作和拓展功能而开发出来的解释性语言,不同于传统的编程语言,脚本语言不需要 ...

  9. 多线程、委托、Invoke解决winform界面卡死的问题,并带开关

    一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...

  10. @autowired和@resource的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自 动注入罢了.@Resource有两个属性是比较重要的, ...