最近在做Outlook的Add-In,需要在Outlook工具栏上加个按钮,用户点击的时候,能够将当前的邮件保存下来,再对保存的邮件进一步的一些操作。
关于如何在.Net中实现Outlook插件,找到一片不错的文章:An Introduction to Programming Outlook 2003 Using C#,照猫画虎,也做的差不多了。
然后在运行的时候,遇到了第一个问题,就是当点击按钮的时候,会弹出提示筐,要求确认是否允许访问Outlook:
导致弹出对话框的原因,是因为Outlook中实现了一个叫做Outlook Object Model Guard的措施,用于控制对于Outlook中某些重要信息(如邮件地址、正文)的编程访问。为了保存邮件所需要调用的MailItem—SaveAs方法,是在安全控制之类的。想想几年前病毒和垃圾邮件利用Outlook接口大肆传播的情形,可以理解现在的Outlook为啥多了这么多限制。
理解归理解,但是这个弹出对话框实在不是那么雅观,于是寻找解决方法。在参考了一堆文章,尤其是Important Security Notes for Microsoft Outlook COM Add-In Developers之后,大概里清楚了思路:
对于受到Outlook Object Model Guard保护的Outlook编程接口中的属性和方法,在同时满足如下两个条件的情况下,不会弹出安全警告筐:
1. 对于属性和方法的调用,是在受信任的COM Dll中进行的。
在Outlook 2003默认安全环境下,所有的COM Dll是受信任的;如果Outlook 2003连到Exchange环境中,对于COM Dll的信任将依赖于Exchange管理员定义的安全策略。
2. 在满足1的条件下,应用代码中,被调用的对象,必须是从受信任的Outlook Application对象(就是在OnConnection事件中传入的那一个)中派生出来的
然而,对于Visual Studio 2003开发出来的Outlook Add-In,默认情况下,将不会被信任(Outlook 2002 COM add-ins are not trusted if they are created in Visual Studio .NET)。因为这些基于.Net的Add-In本身并不直接与Outlook发生联系,而是由Mscoree.dll作为中继。如果要解决或者避开这个问题,在上述的知识库文档中,提出了几种方法:
1. 信任Mscoree.dll,但是这将导致Outlook信任所有.Net Add-In,会导致安全风险
2. 为.Net Add-In创建COM的封装类(Using the COM Add-in Shim Solution to Deploy Managed COM Add-ins in Office XP)
3. 更改Outlook的安全等级
4. 使用VB或者VC开发Add-In
对于牵涉到安全方面的Workaround,都是不考虑的。Shim Solution看上去又太丑。正在犹豫是不是要改用VB的时候,又似乎遇到了另外一个VS2003 Add-In的问题:When COM Registration fails in an MSI (vsdraCOM has no affect),于是下定决心,翻出VS6的安装程序,在n年之后,重新用起了VB6。