业务需要,开发了个ExcelAddIn:
- 用VSTO开发的Ribbon界面;
- 用ExcelDna开发的用户自定义函数;
开发环境:Win10 64位 + Visual Studio 2017社区版 + Office 2016 64位。
问题:ExcelAddIn在开发机器工作正常,但在其它机器部署出现问题,即使环境一样,Ribbon界面始终无法正常显示,自定义函数功能正常。
解决过程:
1)经过反复比较开发机跟部署机上AddIn的区别,首先注意到的一点是,在开发机上AddIn被加载为Com加载项,而在部署机上AddIn被加载为Excel加载项;
2)在网上搜索了一些文档和blog,尝试从Excel里以Com加载的形式加载xxxAddIn.dll和.xll,没有成功,更是收到提示“模块已加载但找不到入口点dllregisterserver”;
3)根据网上的一些blog,尝试使用regsvr32.exe手动注册xxxAddIn.dll,即使以管理员身份执行“regsvr32.exe xxxAddIn.dll”,仍然收到相同的提示“模块已加载但找不到入口点dllregisterserver”;
4)既然在开发机上AddIn可以被注册为Com加载项,说明一定是其它问题,比较可能的是vsto开发的dll的注册方式不一样;
5)在开发机上观察了AddIn加载相关的信息,留意到除AddIn所在的路径外,注册信息不是常见的.dll,而是vsto文件和特别的结尾“vsto|vstolocal”,怀疑这是解决问题的关键;
6)以“vsto|vstolocal”为关键词检索,找到微软的官方文档:https://docs.microsoft.com/zh-cn/visualstudio/vsto/improving-the-performance-of-a-vsto-add-in?view=vs-2019;
7)查看完文档,按照官方文档的提示在注册表加上相应的项:
[HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\Addins\MyAddIn]
"Description"="MyAddIn"
"FriendlyName"="MyAddIn"
"LoadBehavior"=dword:00000003
"Manifest"="file///D:\xxx\xxxx\MyAddIn.vsto|vstolocal"
8)重新打开Excel,Ribbon加载正常,问题初步解决;
9)同时意外发现自定义函数工作不正常,决定按平常一样双击打开xxx64_packed.xll文件,然后自定义函数也工作正常了;
10)关闭Excel并重新打开,Ribbon界面和自定义函数均工作正常。
总结:
1)VSTO开发的Ribbon对象的加载方式跟一般dll不一样;
2)Ribbon和自定义函数事实上是两个不同的东西,是独立加载的,之前一直认为把它们放在一起,加载的时候也是自动一起加载的,理解不对。