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 安装程序配置完成。我尝试了以下但没有成功:
- 我的项目注册表项的名称是 "Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\COMPANY.CustSvc.Watchtower"。据我了解,这必须列为 FormRegions 注册表项的一部分。
- FormRegions\IPM.注意分支是"Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\FormRegions\IPM.Note"
- IPM.Note 的条目是 "WATCHTOWER.RepInfo"(这是 FormRegionName 属性的名称),值是“=COMPANY.CustSvc.Watchtower”(注册表项的名称。
- 我根据@Eugene 的建议添加了日志记录,并且没有从 FormRegionInitializing 事件中记录任何内容,因为它没有触发。
关于为什么 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 使用此信息加载表单区域。
我构建了一个 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 安装程序配置完成。我尝试了以下但没有成功:
- 我的项目注册表项的名称是 "Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\COMPANY.CustSvc.Watchtower"。据我了解,这必须列为 FormRegions 注册表项的一部分。
- FormRegions\IPM.注意分支是"Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\Outlook\AddIns\FormRegions\IPM.Note"
- IPM.Note 的条目是 "WATCHTOWER.RepInfo"(这是 FormRegionName 属性的名称),值是“=COMPANY.CustSvc.Watchtower”(注册表项的名称。
- 我根据@Eugene 的建议添加了日志记录,并且没有从 FormRegionInitializing 事件中记录任何内容,因为它没有触发。
关于为什么 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 使用此信息加载表单区域。