【问题标题】:FormRegionInitializing only fires when in Debug Mode (VSTO Outlook)FormRegionInitializing 仅在处于调试模式 (VSTO Outlook) 时触发
【发布时间】:2020-06-10 18:22:20
【问题描述】:

我已经构建了一个 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 的回复,我查看了为每个消息类插入注册表项的要求,因为documentation from 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 没有触发的任何其他想法?

【问题讨论】:

    标签: c# vsto outlook-addin visual-studio-debugging outlook-form


    【解决方案1】:

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

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

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

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

    使用关联的 Outlook VSTO 插件自动部署表单区域。因此,您不必执行任何特殊任务来部署表单区域。有关部署 VSTO 插件的更多信息,请参阅Deploy an Office solution

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

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

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

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

    【讨论】:

    • 感谢您的回复。我将阅读您引用的注册表项和条目,并在安装过程中检查它们是否已安装在用户计算机上。我还将了解有关使用日志记录的更多信息。感谢您的建议。
    • Eugene,我返回并添加了注册表项和日志记录(请参阅 OP 中的更新),但在 FormRegionInitializing 事件中仍然没有触发任何内容。还有其他想法吗?
    • 经过进一步审查,我意识到我将FormRegions 注册表项添加到一个目录太低了。不注意细节取胜!我将 Eugene 的答案标记为正确,因为它要求我通过安装程序过程手动添加注册表项。
    猜你喜欢
    • 1970-01-01
    • 2015-10-31
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多