基于Visual Studio 2003/2005的Office插件开发FAQ

news/2024/7/6 0:29:07

基于Visual Studio 2003/2005的Office插件开发FAQ

 最近处理了好几个Office Addin的问题,总结出一些经验,在此与大家分享一下。

首先介绍一些注意点

1. 一定要把宏安全级别设置为Medium以下,默认是High,肯定不允许运行任何Addin,这点一定要注意,否则再怎么改程序也是徒劳

2. 在开发Addin的机器上,建议仅安装一个版本的Office,否则可能因为引用的Office Library Reference混淆,导致在其他机器上无法正常加载

3. 如果你开发的是Office XP的Add-in,必须安装Office XP PIA (primary interop assemblies),这是对Office COM对象的封装库。

你可以到
http://www.microsoft.com/downloads/details.aspx?familyid=C41BD61E-3060-4F71-A6B4-01FEBA508E52&displaylang=en 下载。

3. 在创建Addin项目时一定要正确选择Office目标程序,如Word, Excel, Visio, PowerPoint等,如下图所示:


4. 在创建Addin向导的倒数第二步,通常情况下一定要将两个选项都选中,特别是第二个选项,否则可能由于不支持所有用户都运行,而出现未自动加载的情况。


接下来是常见问题解答

问题1 在Office插件加载时,即使加载失败也不会有任何提示,如果出现Assembly加载错误,我该如何跟踪这些错误
我们可以在.net自带的工具中找到一个叫做Assembly Binding Log Viewer的工具,通过它我们可以几乎所有的assembly加载异常。要注意的是,每个版本的.net都自带了一个相应版本的Assembly Binding Log Viewer,所以运行的时候要看一下调用的是哪个版本的。比如我们现在要调试基于.net 1.1开发的Office插件,可以通过以下步骤运行:
1. 点击 开始 > Microsoft Visual Studio .NET 2003 > Visual Studio .NET 工具 > Visual Studio .NET 2003 命令提示,
2. 在进入Visual Studio 2003命令行模式下,输入fuslogvw.exe

这时我们就可以看到该工具的界面了,如图:


有关该工具的详细信息可以看
http://msdn2.microsoft.com/en-us/library/e74a18c4(vs.80).aspx

同样的,如果我们要启动.net 2.0的Assembly Binding Log Viewer就在VS2005的命令行下输入fuslogvw。

问题2 Visual Studio 2005开发的Office插件无法在Office中运行
这个问题可能是由于没有安装KB908002中提到的prerequisite造成的,可以去下面的地址下载该文档中提到的补丁:
http://support.microsoft.com/kb/908002

安装完成后,我们可以在Add-in的安装项目的prerequisites中找到一个新的组件。

如上图所示,其中多了一个Shared Add-in Support Update for Microsoft .NET Framework 2.0 (KB908002)

问题3 如何制作兼容多个版本Office的Office Addin
通常情况下,我们编写的Add-in都是直接用向导生成的,且使用的是早期绑定技术(early binding)。但在许多需求中,我们需要制作一个能够兼容多个Office版本的Add-in,这时我们就不能使用早期绑定了,而应该使用后期绑定(late binding)。关于早期绑定和后期绑定的详细信息,请见
http://word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm

问题4 通常Addin设置保存在注册表的什么位置
以Office 2003 Word Add-in为例,通常会保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Word/Addins中。
假设我们有一个名字为MyAddin1的Addin,那么它就会保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Word/Addins/MyAddin1.Connect中。

对于Excel Add-in来说,也是类似的,通常保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Office/Excel/Addins中,依此类推。

在每个Add-in的设置属性中有一个重要的标志LoadBehavior,这个属性是保存在XXXX.Connect中的,类型为DWORD,这个值直接决定了Addin的启动模式,默认值为3表示Office应用程序一启动就运行,这个设置与我们在Addin向导中选择的"I would like my Add-in to load when the host application loads"是对应的。

问题5 当确定你的Add-in应该可以正确加载,但在启动时没有加载,这是怎么回事
如果一个Add-in因为某些原因在启动时加载失败,Office应用程序会自动把LoadBehavior改成8,这表示仅在需要加载时才加载该Add-in,而不是在Office启动时。所以这时可以到与该Add-in对应的注册表项中检查一下LoadBehavior值是否正确,如果为8,一定把它改成3。

问题6 你不确定Add-in的哪一部分出了问题,该如何调试
首先必须确定assembly的引用没有出现问题,关于如何检测引用出错的情况已经在问题1中说明。

接下来我们就要检查OnConnection是否被调用,我们可以在OnConnection中加入一句调试语句,如下

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref  System.Array custom)
{
MessageBox.Show(
"OnConnection Loaded"
);
applicationObject 
=
 application;
addInInstance 
=
 addInInst;
}

如果OnConnection加载成功,那么肯定会弹出一个对话框,否则就要考虑检查一下是不是设置的问题,如是不是LoadBehavior的值不正确。(见问题5)

接下来的调试也是类似的,通过加入MessageBox.Show或其他调试语句来检查代码是否已运行到某个位置。

 

http://www.niftyadmin.cn/n/1999553.html

相关文章

es6中新增数组的方法

1. Array.from 这个东西就是把一些集合,或者长的像数组的伪数组转换成真的数组,比如arguments,js选择器找到dom集合, 还有对象模拟的数组 var obj { 0 : 1, length : 1 } Array.from(obj / arguments / 伪数组) //返回的是一个数组 [].slice…

nvidia控制面板点了没反应win7_Win7系统打不开Nvidia控制面板提示“停止工作”怎么办...

众所周知,显卡是win7系统电脑中比较重要的部件,如果显卡出现问题,会导致显示屏打不开或者显示画面看不请,还好Win7系统中有个Nvidia控制面板,能够对显卡进行设置,提升显卡功能。但有用户说打不开Nvidia控制…

历史上死的最窝囊的十个男人

历史上死的最窝囊的十个男人 评选的标准是:入选的人都是是当时的英雄人物。所谓是指他们或者由于不应该有的失误,或者由于命运的捉弄,很丢人地死去了,根本不符合自己的地位。而如果他们不死,是很有可能改变历史的。…

python文件操作学习笔记

#文件操作:读:f open("/Users/zhouhaijun/python/01.py","r")x f.read()print x写:f open("/Users/zhouhaijun/python/file_01.py","wb")f.write("ok")f.close()读:f open("/Use…

php 依赖注入 数据库切换_PHP控制反转(IOC)和依赖注入(DI)

先看一个例子&#xff1a;<?phpclass A {public $b;public $c;public function A(){//TODO}public function Method(){$this->bnew B();$this->cnew C();$this->b->Method();$this->c->Method();//TODO} }class B {public function B(){//TODO}public fu…

Windows 进程

系统进程 [system process] alg.exe csrss.exe ddhelp.exe dllhost.exe explorer.exe inetinfo.exe internat.exe kernel32.dll lsass.exe mdm.exe mmtask.tsk mprexe.exe msgsrv32.exe mstask.exe regsvc.exe rpcss.exe services.exe smss.exe snmp.exe spool32.exe spoolsv.e…

jrtplib 打包做了哪些事_渠道推广运营要做哪些事?

一篇文章让运营人学会渠道推广&#xff01;进了一家教育公司&#xff0c;里面有一个岗位叫做学科&#xff0c;这个职业的工作主要分两个部分&#xff0c;一个叫做渠道&#xff0c;一个叫做招生&#xff0c;所以&#xff0c;学科是干什么的&#xff0c;不言而喻。所谓渠道&#…

#!/usr/bin/env python与#!/usr/bin/python的区别

脚本语言的第一行&#xff0c;目的就是指出&#xff0c;你想要你的这个文件中的代码用什么可执行程序去运行它&#xff0c;就这么简单 #!/usr/bin/python是告诉操作系统执行这个脚本的时候&#xff0c;调用/usr/bin下的python解释器&#xff1b;#!/usr/bin/env python这种用法是…