【发布时间】:2013-08-27 06:22:51
【问题描述】:
概述
我有一个使用 VSTO 创建的 Outlook 加载项。加载项有一个 Mail.Compose 功能区类型的功能区(视觉设计器)。功能区选项卡ControlIdType 设置为“自定义”。加载项中除设计器代码之外的唯一代码是功能区的以下 Load 处理程序。 this.Context.CurrentItem 意外返回 null。
代码
private void RibbonComposeMail_Load(object sender, RibbonUIEventArgs e)
{
try
{
var inspector = this.Context as Outlook.Inspector;
if (inspector == null)
{
throw new ApplicationException("Fail - Step 1");
}
var currentMailItem = inspector.CurrentItem as Outlook.MailItem;
if (currentMailItem == null)
{
throw new ApplicationException("Fail - Step 2");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
步骤
- 打开草稿电子邮件。功能区加载正常。
- 从收件箱打开电子邮件。
- 打开相同的草稿电子邮件。功能区在第 2 步失败,
inspector.CurrentItem为空。
注意事项
- 我在 Outlook 2007、2010 和 2013 中对此进行了测试,在 VS2010 中创建了 Outlook 2007 和 2010 插件,在 VS2012 中创建了 Outlook 2010 插件。所有行为都相同。
- 重复打开电子邮件草稿似乎不会导致问题,必须在其间打开 Email.Read 检查器。
- 功能区选项卡
ControlidType很重要。 “自定义”会导致问题,但“Office”的默认选项不会出现问题。 - 颠倒场景并将功能区类型设置为
Mail.Read会产生相同的结果,前提是打开顺序相反为收件箱 > 草稿 > 收件箱(失败)。 - 在
inspector和currentMailItem对象上调用Marshal.ReleaseComObject的所有可能排列都没有区别。
【问题讨论】:
-
其他人至少可以复制错误吗?据我所知,我没有做错任何事。这看起来是获得与功能区关联的项目的公认方式,但它失败了!甚至这个 VSTOTeam 博客也使用了几乎相同的技术 - blogs.msdn.com/b/vsto/archive/2010/02/23/… - 我尝试了他们的代码,只是略有不同,它也显示了错误。这可能是最近 3 个 Outlook 版本中一直存在但未被注意到的错误吗?
标签: c# vsto outlook-addin