对 RibbonID Microsoft.Outlook.Explorer 的 GetCustomUI() 调用失败

本文关键字:调用 失败 GetCustomUI RibbonID Microsoft Outlook Explorer | 更新日期: 2023-09-27 18:36:12

我开发了一个Outlook 2010加载项,

它可以在Visual Studio(2010)中打开该项目的任何计算机上完美运行,但是在所有其他计算机上都失败,并显示错误消息:

"对 RibbonID Microsoft.Outlook.Explorer 的 GetCustomUI() 调用失败"

这告诉我,对 IRibbonExtensibility 接口方法的调用失败了。这是一个运行时错误,但是我不知道它是如何或为什么发生的。

"相同"外接程序以前与功能区设计器类一起使用,现在已更改为使用功能区 XML 来支持外接程序的一些添加上下文菜单功能。

该错误的影响是,尽管加载项处于"活动"状态并加载到 Outlook 中,但其任何按钮等都不会显示,因为错误发生在可以显示任何 XML 功能区设计之前。

在我发现的各种疑难解答文章中,有很多关于可能出错的建议,其中之一是我编写的代码可能与 Outlook 2007 匹配并且不适用于 2010,但我不知道潜在的差异在哪里。

下面是来自外接程序结构中不同位置的一些代码:

在 MyOutlookAddIn.cs:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
    return new Ribbon();
}
#region VSTO generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InternalStartup()
{
    this.Startup += new System.EventHandler(ThisAddIn_Startup);
    this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion

在功能区中.cs:

public string GetCustomUI(string ribbonId)
{
    Debug.WriteLine(ribbonId);
    //Return the appropriate Ribbon XML for ribbonID
    switch (ribbonId)
    {
        case "Microsoft.Outlook.Explorer":
            return GetResourceText("OutlookAddIn.RibbonDesignXML.Explorer.xml");
        case "Microsoft.Outlook.Mail.Read":
            return GetResourceText("OutlookAddIn.RibbonDesignXML.MailReadRibbon.xml");
        case "Microsoft.Outlook.Appointment.Read":
            return GetResourceText("OutlookAddIn.RibbonDesignXML.AppointmentReadRibbon.xml");
        default:
            return null;
    }
}
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
    this.ribbon = ribbonUI;
}

我的XML返回了"Microsoft.Outlook.Explorer"("OutlookAddIn.RibbonDesignXML.Explorer.xml"):

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <!-- Når en mail er valgt i kalender oversigten -->
    <tabs>
      <tab idMso="TabMail">
        <group id="groupTabMail" label="Jira">
          <button id="sendToJiraBtn" onAction="ExplorerSendToJiraButtonClicked" label="Send til Jira" getImage = "GetImage" size="large" />
          <button id="jiraSettingsBtn" onAction="ExplorerSettingsButtonClicked" label="Indstillinger" getImage="GetSettingsImage" size="large" />
          <button id="jiraSupportBtn" onAction="ExplorerSupportButtonClicked" label="Hjælp" getImage="GetSupportImage" size="large" />
        </group>
      </tab>
    </tabs>
    <!-- Når en aftale er valgt i kalender oversigten -->
    <contextualTabs>
      <tabSet idMso="TabSetAppointment">
        <tab idMso="TabAppointment">
          <group id="groupTabAppointment" label="Jira">
            <button id="sendToJiraBtnAppointment" onAction="ExplorerSendToJiraButtonClicked" label="Send til Jira" getImage = "GetImage" size="large" />
            <button id="jiraSettingsBtnAppointment" onAction="ExplorerSettingsButtonClicked" label="Indstillinger" getImage="GetSettingsImage" size="large" />
            <button id="jiraSupportBtnAppointment" onAction="ExplorerSupportButtonClicked" label="Hjælp" getImage="GetSupportImage" size="large" />
          </group>
        </tab>
      </tabSet>
      <tabSet idMso="TabSetReccurringAppointment">
        <tab idMso="TabRecurringAppointment">
          <group id="groupTabRecurringAppointment" label="Jira">
            <button id="sendToJiraBtnRecurringAppointment" onAction="ExplorerSendToJiraButtonClicked" label="Send til Jira" getImage = "GetImage" size="large" />
            <button id="jiraSettingsBtnRecurringAppointment" onAction="ExplorerSettingsButtonClicked" label="Indstillinger" getImage="GetSettingsImage" size="large" />
            <button id="jiraSupportBtnRecurringAppointment" onAction="ExplorerSupportButtonClicked" label="Hjælp" getImage="GetSupportImage" size="large" />
          </group>
        </tab>
      </tabSet>
    </contextualTabs>
  </ribbon>

  <contextMenus>
    <contextMenu idMso="ContextMenuMailItem">
      <menuSeparator id="MailSeparator"/>
      <button id="SendToJiraMailItem"
          getImage = "GetImage"
          label="Send til Jira"
          onAction="ExplorerSendToJiraButtonClicked"/>
      <dynamicMenu id="DynamicMenuMail" label= "Send til Jira som..." getImage="GetImage" getContent="GetContent" />
    </contextMenu>
    <contextMenu idMso="ContextMenuMultipleItems">
      <menuSeparator id="MultipleItemsSeparator"/>
      <button id="SendToJiraMultipleItems"
          getImage = "GetImage"
          label="Send til Jira"
          onAction="ExplorerSendToJiraButtonClicked"/>
      <dynamicMenu id="DynamicMenuMultiple" label= "Send til Jira som..." getImage="GetImage" getContent="GetContent" />
    </contextMenu>
    <contextMenu idMso="ContextMenuCalendarItem">
      <menuSeparator id="AppointmentSeparator"/>
      <button id="SendToJiraCalendarItem"
          getImage = "GetImage"
          label="Send til Jira"
          onAction="ExplorerSendToJiraButtonClicked"/>
      <dynamicMenu id="DynamicMenuAppointment" label= "Send til Jira som..." getImage="GetImage" getContent="GetContent" />
    </contextMenu>
  </contextMenus>
</customUI>

很抱歉与您共享如此多的代码,但是重现该问题似乎是一项徒劳的任务,而且我面临着时间压力,因为由于扩展功能完全破坏了加载项,加载项无法被我工作场所的各种实体使用。

提前感谢任何能够深入了解可能出错的人!尤其是为什么它适用于涉及开发的机器而不是其他机器......

对 RibbonID Microsoft.Outlook.Explorer 的 GetCustomUI() 调用失败

我发现了问题。声明:

Debug.WriteLine(ribbonId);

使整个应用程序在客户端计算机上崩溃,但在开发机器(已打开项目的机器 i Visual Studio)上没有崩溃。

有没有人知道这是怎么回事?Debug.WriteLines的全部目的不就是它只在调试期间起作用吗?发布项目后,它不应该给 VSTO 带来问题......一个荒谬且很难发现的错误,因为它对我来说没有任何意义。

感谢您的回复,@Maarten范斯塔姆。

确保将

功能区 XML 作为嵌入资源添加到项目中。我经常看到这个小细节被省略,导致在开发人员计算机上运行没有问题,但在客户端最终用户计算机上失败。

如果这已经正确完成(您的文本没有进入该细节),唯一的选择是剥离。此问题可能是功能区 XML 定义或读取功能区 XML 文件的一部分。只需从非常简单的XML一键定义开始,看看它是否适用于您的计算机和客户端最终用户计算机。与GetCustomUI相同,将其限制为一行并检查结果。从那里开始扩展,直到找到失败的来源。