如何在VSTO Outlook插件与Office 365插件间互相检测对方是否激活?
这个问题确实挺常见的——当你同时维护VSTO和Office 365(Web)插件时,避免用户看到重复插件、实现平滑过渡是很重要的。下面分两种场景给你具体的解决方案:
从Office 365插件检测Windows VSTO插件是否安装
因为Web Add-in运行在浏览器/ WebView环境中,无法直接读取Windows注册表(VSTO插件的安装信息通常存在这里),所以得靠「间接标记」或者双向通信的方式实现:
方法1:让VSTO插件留下可检测的标识
你可以让VSTO插件在Outlook的可访问区域留下一个唯一标记,然后Web Add-in去读取这个标记:- VSTO端操作:在插件启动时,创建一个隐藏邮件(比如放在专门的隐藏文件夹,或者「已删除邮件」里并标记为保留),给它添加自定义属性(比如
VSTO_Addin_Installed = "True"),或者直接在邮件内容里写入唯一的标识字符串。 - Web Add-in端操作:使用
Office.context.mailbox.getCallbackTokenAsync获取访问令牌,然后调用Microsoft Graph API查询这个隐藏邮件。如果能找到对应的标识,就说明VSTO插件已安装。
小贴士:记得定期检查这个标记是否存在,防止用户误删后导致检测失效。
- VSTO端操作:在插件启动时,创建一个隐藏邮件(比如放在专门的隐藏文件夹,或者「已删除邮件」里并标记为保留),给它添加自定义属性(比如
方法2:直接双向通信(仅限Outlook 2019及以上版本)
如果你面向的是较新版本的Outlook,可以利用Office的跨插件通信能力:- VSTO端:注册一个自定义函数,用于返回插件的安装状态。
- Web Add-in端:通过
Office.context.mailbox.item.invokeCustomFunction调用VSTO暴露的函数,直接获取安装状态结果。
从VSTO插件检测Office 365插件是否安装
这个场景相对简单,因为VSTO可以直接访问Outlook对象模型中的Web Add-ins列表:
- 在VSTO代码里,遍历
Application.WebAddIns集合,检查目标Office 365插件的ID是否存在(还能顺便检查是否启用):
注意:这个方法要求Outlook版本在2016及以上,因为using Outlook = Microsoft.Office.Interop.Outlook; using System; public bool CheckOffice365AddinStatus(string targetAddinId) { Outlook.Application outlookApp = Globals.ThisAddIn.Application; foreach (Outlook.WebAddIn addin in outlookApp.WebAddIns) { if (addin.Id.Equals(targetAddinId, StringComparison.OrdinalIgnoreCase)) { return addin.IsEnabled; // 返回插件是否启用,也可以直接返回true表示已安装 } } return false; }WebAddIns属性是从Outlook 2016开始引入的。
额外注意事项
- 权限配置:Web Add-in调用Graph API需要在manifest.xml中声明对应的权限(比如
Mail.Read),否则会被拒绝访问。 - 版本兼容:如果你的用户还在使用Outlook 2013这类旧版本,那
WebAddIns属性不可用,得换方法1的标记方案。 - 用户体验优化:检测到重复插件后,可以在界面上提示用户禁用其中一个,或者自动隐藏当前插件的核心功能,只显示过渡引导。
内容的提问来源于stack exchange,提问作者Shubh




