浅谈Excel开发:十一 针对64位Excel的插件的开发和部署
自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的插件的开发和部署的更多相关文章
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- 64位Ubuntu14.04搭建ADT开发环境
本来放假是要出去玩的,结果出游计划拖到了周一,今天先来无事看看ubuntu最近发展得怎么样了,顺便把ADT也搭建好,方便以后研究android框架.想想在windows下,ADT直接down下来解压就 ...
- 64位WINDOWS系统环境下应用软件开发的兼容性问题(CPU 注册表 目录)
应用软件开发的64 位WINDOWS 系统环境兼容性 1. 64 位CPU 硬件 目前的64位CPU分为两类:x64和IA64.x64的全称是x86-64,从名字上也可以看出来它和 x86是兼容的,原 ...
- excel 导入数据库 / SSIS 中 excel data source --64位excel 版本不支持-- solution
当本地安装的excel(2013版) 是64-bit时:出现的以下两种错误 解决: 1. excel 导入数据库 , 如果文件是2007则会出现:“The 'Microsoft.ACE.OLEDB.1 ...
- vs2010中配置OpenGL以及针对64位系统所遇问题的解决办法
一.下面将对VS2010中配置OpenGL进行简单介绍. 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C+ ...
- c# excel 读写 64位操作系统 64位excel
用c#读写excel时,会出现 “本机未注册Microsoft.ACE.OLEDB.12.0 驱动(什么的,忘了)” 读写 64位的excel 时,要在项目属性里改一下目标平台,默认的为*86, 改为 ...
- ubuntu 14.04 64位使用google官方android开发集成工具adt-64位无法使用adb
在使用ubuntu64位(14.04)时,下载来一个adt-bundle-linux-x86_64-20131030.zip,但是运行时报错: Android: Gradle: Execution f ...
- 【Qt开发】Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包
Win7 64位qt-windows-x86-msvc2015-5.6.0 DLL依赖库打包 今天开始系统的学习QT,第一个测试的问题就是在纯净的系统中如何正常运行,也就是找出QT生成的exe的依赖库 ...
- 浅谈Redis的基本原理和数据类型结构的特性和应用开发场景
一.Redis介绍 1,redis介绍(Redis安装在磁盘:Redis数据存储在内存) redis是一种基于键值对(key-value)数据库,其中value可以为string.hash.list. ...
随机推荐
- Oracle连接与会话
连接(connection):连接是从客户端到oracle数据库实例的一条物理路径. 会话(session):会话是数据库实例中存在的一个逻辑实体. case1:一个连接可以有多个会话 SQL> ...
- java相关的小问题
对线程异常的处理 调用Thread的静态方法Thread.setDefaultUncaughtExceptionHandler()
- NoSql数据库初探-mongoDB环境搭建
NoSQL数据库一改关系型数据库的缺点,更容易的集成.分布式.无模式.故障恢复等特点,正在一步步餐食关系型数据库的市场,作为一个与时俱进的码农了解一下新技术是必须的,尤其是在读了<NoSql精粹 ...
- ROS学习(三)—— ROS文件系统
一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...
- Java EE之数据库连接与插入
在这之前应该先: **保证项目中导入了mysql-connector-java-5.1.23-bin.jar **服务器上的数据库24小时连接成功: 1.在源包下新建一个普通的Java文件,取名为My ...
- 【转】Oracle索引HINT的使用
转自:Oracle索引HINT的使用 存储在数据库中数据的分布情况开发人员或管理员比Oracle优化器更加的清楚,在优化器不能作出最有查询路径选择的情况下,使用HINT(提示)人为的固定查 ...
- 使用GDB 追踪依赖poco的so程序,core dump文件分析.
前言 在windows 下 系统核心态程序蓝屏,会产生dump文件. 用户级程序在设置后,程序崩溃也会产生dump文件.以方便开发者用windbg进行分析. so,linux 系统也有一套这样的东东- ...
- 关于MySQL 的LEFT JOIN ON的问题
今天在查询视图时,遇到了一个问题. 因为mysq不能嵌套select的子查询.所以我把子查询建成了视图b,主查询通过left join on关联视图b ,形成视图a. 由于视图b中也有left joi ...
- 格式化input输入内容(金额)
项目中要用到格式化金额输入框,要求每三个数字用逗号分割开. 添加一个directive angular.module('myApp.directives', []) .directive('filte ...
- 自定义 TableViewCell 的分割线
刚开始自定义 tableViewCell 的时候,用的是直接在 cell 上加一张 imageView 的方法,如果在点击 cell 的时候有页面的跳转,这样做没什么问题,但是,如果在点击 cell ...