FormRegionInitializing 仅在调试模式下触发(VSTO Outlook)

FormRegionInitializing only fires when in Debug Mode (VSTO Outlook)

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

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

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

我是运行 Outlook 2016 (Click-to-运行) 和 VS 2019.

我会喜欢关于 check/try 的任何其他建议。

谢谢!

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 的回复,我查看了为每条消息 class 插入注册表项的要求,因为 documentation from Microsoft 表明这必须通过 Windows 安装程序配置完成。我尝试了以下但没有成功:

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

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

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

However, when installed using a setup program

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

窗体区域会使用关联的 Outlook VSTO 加载项自动部署。因此,您不必执行任何特殊任务来部署窗体区域。有关部署 VSTO 加载项的详细信息,请参阅 Deploy an Office solution

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

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

  • 每个窗体区域的条目和表示 Outlook VSTO 加载项名称的关联值。

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