0

我已经构建了一个 VSTO Outlook 加载项,当从对象资源管理器中选择邮件消息(IPM.Note 消息类)时,它只会在阅读窗格中显示一个相邻的表单区域。加载项在调试模式下按预期工作。但是,当使用安装程序安装时,加载项会正确加载(并且代码会在启动时触发 MessageBox.Show(),但不会显示表单区域。我已将 MessageBox.Show() 事件放在 RepInfoFactory_FormRegionInitializing 方法中但他们都没有开火。

我搜索了类似的情况,但只找到了整个加载项被禁用的情况。就我而言,它加载得很好。我尝试以管理员身份启动 Outlook,但这似乎不会影响加载项。我还设置了环境变量以显示 VSTO 警报并记录它们,但没有记录任何内容——我怀疑是因为加载项加载正常。

由于我将 FormRegionMessageClass 属性设置为 Note,因此我仔细检查了资源管理器中的对象确实是 IPM.Note。

我正在运行 Outlook 2016(即点即用)和 VS 2019。

我会喜欢关于检查/尝试的任何其他建议。

谢谢!

public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            MessageBox.Show("Addin Startup");  //this message box displays in both debug and installed version
        }
    }

partial class RepInfo
    {
        public static Outlook.ExchangeUser contact;
        public static System.Data.DataTable dtRepHier;
        public static System.Data.DataTable dtSubHier;
        #region Form Region Factory 

        [Microsoft.Office.Tools.Outlook.FormRegionMessageClass(Microsoft.Office.Tools.Outlook.FormRegionMessageClassAttribute.Note)]
        [Microsoft.Office.Tools.Outlook.FormRegionName("WATCHTOWER.RepInfo")]
        partial class RepInfoFactory
        {
            //The code in this method only works in debug mode.  The form only displays (under the stated conditions) when in debug mode.
            private void RepInfoFactory_FormRegionInitializing(object sender, Microsoft.Office.Tools.Outlook.FormRegionInitializingEventArgs e)
            {
                //MessageBox.Show(e.FormRegionMode.ToString() + " " + e.FormRegionSize.ToString());
                Outlook.MailItem myItem = (Outlook.MailItem)e.OutlookItem;
                //MessageBox.Show(myItem.MessageClass);
                if (myItem != null)
                    //MessageBox.Show(myItem.Sender.Name);
                    if (myItem.Sender != null)
                    {
                        {
                            contact = myItem.Sender.GetExchangeUser();
                        //MessageBox.Show(contact.Department);
                            if (contact != null && contact.Department != null && (contact.Department.Substring(7, 10) == "US-AVD-VAS"
                                || contact.Department.Substring(7, 9) == "US-AVD-US"))
                            { return; }
                        }

                        e.Cancel = true;
                    }
            }
        }

        #endregion
// code continues

更新 根据下面@Eugene 的回复,我查看了为每个消息类插入注册表项的要求,因为Microsoft 的文档表明这必须通过Windows Installer 配置来完成。我尝试了以下但没有成功:

  • 我的项目注册表项的名称是“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\COMPANY.CustSvc.Watchtower”。据我了解,这必须作为 FormRegions 注册表项的一部分列出。
  • FormRegions\IPM.Note 分支是“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\FormRegions\IPM.Note”
  • IPM.Note 的条目是“WATCHTOWER.RepInfo”(这是 FormRegionName 属性的名称),值为“=COMPANY.CustSvc.Watchtower”(注册表项的名称。
  • 我根据@Eugene 的建议添加了日志记录,并且没有从 FormRegionInitializing 事件中记录任何内容,因为它没有触发。

关于为什么 FormRegionInitializing 没有触发的任何其他想法?

4

1 回答 1

0

首先,我建议在代码中添加任何日志记录机制,以查看代码在最终用户机器上的工作方式并记录异常(如果发生)。

MessageBox.Show方法不是测试代码的正确方法。

但是,当使用安装程序安装时

Microsoft.Office.Tools.Outlook命名空间使您可以访问表示表单区域的类、显示表单区域的 Outlook 项目以及其他有用的项目。Outlook 窗体区域项会自动在项目中添加对此程序集的引用,并在窗体区域代码文件的顶部插入适当的 using 或 Imports 语句。

表单区域使用关联的 Outlook VSTO 加载项自动部署。因此,您不必执行任何特殊任务来部署表单区域。有关部署 VSTO 外接程序的详细信息,请参阅部署 Office 解决方案

但是,当您构建包含窗体区域的 Outlook VSTO 外接程序项目时,Visual Studio 会将以下信息添加到注册表:

  • 与一个或多个表单区域相关联的每个消息类的键。

  • 每个窗体区域的条目和代表 Outlook VSTO 外接程序名称的关联值。

Outlook 使用此信息来加载表单区域。

于 2020-06-10T21:17:51.320 回答