Ribbon Invalidate使我的Outlook加载项崩溃

时间:2013-03-25 12:16:16

标签: c# outlook-addin ribbon invalidation

我有一个非常大的Outlook加载项,跟随ribbon.xml:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabMail">
    <group id="groupViewHome" label="View tasks">
      <toggleButton id="buttonToggleHistoryHome" getLabel="getLabelToggleHistory" imageMso="ControlToggleButton" onAction="toggleHistory_Click" size="large" getPressed="getEnabledToggleHistory" />
    </group>
      </tab>
      <tab idMso="TabAddIns" label="DCP">
    <group id="groupCreateTask" label="Create a task">
      <button id="buttonNewTask" label="New Task" imageMso="QueryAppend" onAction="buttonNewTask_Click" size="large" getEnabled="getMailSelected" />
    </group>
    <group id="groupEdit" label="Edit a task">
      <button id="buttonAddSelection" label="Copy selection to task" imageMso="QueryUpdate" onAction="selectedText_Click" size="large" getEnabled="getMailAndIDSelected"/>
    </group>
    <group id="groupView" label="View tasks">
      <button id="buttonTaskHistory" imageMso="FileDocumentInspect" onAction="taskInfo_Click" getLabel="getButtonHistoryLabel" />
      <toggleButton id="buttonToggleHistory" getLabel="getLabelToggleHistory" imageMso="ControlToggleButton" onAction="toggleHistory_Click" getPressed="getEnabledToggleHistory" />
      <checkBox id="buttonTriggerMail" label="Toggle auto-history" onAction="Trigger_Click" getPressed="getInitialTriggerState"/>
    </group>
    <group id="groupAttach" label="Attachments">
      <button id="saveMail2" label="Add mail as .msg attachment" imageMso="AttachItem" onAction="saveMail_Click" getEnabled="getMailAndIDSelected"/>
      <button id="selectAttach" label="Select attachments to add" imageMso="AttachMenu" onAction="selectAttach_Click" getEnabled="getMailAndIDSelectedAndAttach"/>
    </group>
    <group id="groupLinks" label="Hyperlinks">
      <button id="addLinkToMail" label="Add task link to mail body" imageMso="HyperlinkInsert" onAction="addLink_Click" size="large" getEnabled="getMailAndIDSelected"/>
    </group>
      </tab>
    </tabs>
  </ribbon>
  <contextMenus>
    <contextMenu idMso="ContextMenuReadOnlyMailText">
      <menu id="dcp" label="DCP">
    <button id="selectedText" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click"/>
    <button id="addTask" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailTable">
      <menu id="dcp3" label="DCP">
    <button id="selectedText2" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click"/>
    <button id="addTask3" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailTableCell">
      <menu id="dcp4" label="DCP">
    <button id="selectedText3" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click"/>
    <button id="addTask4" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailListTable">
      <menu id="dcp5" label="DCP">
    <button id="selectedText4" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click"/>
    <button id="addTask5" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailPictureTable">
      <menu id="dcp6" label="DCP">
    <button id="selectedText5" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click" />
    <button id="addTask6" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailTextTable">
      <menu id="dcp7" label="DCP">
    <button id="selectedText6" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click"/>
    <button id="addTask7" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailTableWhole">
      <menu id="dcp8" label="DCP">
    <button id="selectedText7" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click" />
    <button id="addTask8" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailList">
      <menu id="dcp9" label="DCP">
    <button id="selectedText8" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click" />
    <button id="addTask9" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuReadOnlyMailHyperlink">
      <menu id="dcp10" label="DCP">
    <button id="selectedText9" label="Copy selection to task" imageMso="CitationInsert" onAction="selectedText_Click" />
    <button id="addTask10" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuMailItem">
      <menu id="dcp2" label="DCP">
    <button id="buttonTaskHistoryMail" label="View task history" imageMso="SourceControlShowHistory" onAction="taskInfo_Click" />
    <button id="addTask2" label="New task" imageMso="GoToNewRecord" onAction="buttonNewTask_Click" />
    <button id="saveMail" label="Add mail as .msg attachment" imageMso="AttachItem" onAction="saveMail_Click" />
      </menu>
    </contextMenu>
    <contextMenu idMso="ContextMenuAttachments">
    <button id="buttonAddAttachment" label="Add attachment to task" imageMso="AttachMenu" onAction="addAttachment_Click"/>
    </contextMenu>
  </contextMenus>
</customUI>

正如您所看到的,我有几个需要失效的操作才能启用,切换...我的按钮。我的加载项启动很好但在某些情况下崩溃。以下是一些加载项几乎总是崩溃的示例:

  • 在新的检查器窗口中打开邮件项目并再次关闭
  • 打开多个窗口,打开带有自定义按钮的上下文菜单

它发生的时候让我非常确定它与创建新的上下文菜单或功能区时的自动失效有关,而不是在我自己调用它时。删除getEnabled,getPressed ...属性时,错误不会持续存在。我无法找到一种方法来压制错误而不是崩溃或如何解决它。因此,如果有人可以提供帮助或者可以给我更多关于此的信息,我将不胜感激。如果您需要更多代码(例如getEnabled,getPressed ...方法),请告诉我。

我的无效方法。请注意,大多数只返回一个布尔值。这些布尔值在ribbon.cs类中保存为私有变量

public bool getEnabledToggleHistory(IRibbonControl control)
{
   return toggleHistoryPanelState;
}

public bool getMailSelected(IRibbonControl control)
{
    try
    {
        MailItem mailItem = getMail();
        if (mailItem != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    catch (System.Exception ex)
    {
        return false;
    }
}

public bool getMailAndIDSelected(IRibbonControl control)
{
    return mailAndIDSelected;
}

public bool getMailAndIDSelectedAndAttach(IRibbonControl control)
{
    if (hasAttachments && mailAndIDSelected)
    {
        return true;
    }
    return false;
}

如果我在新的Visual Studio实例中调试,我会得到以下内容:

Unhandled exception at 0x70B5B2A7 (MSO.DLL) in OUTLOOK.EXE: 0xC0000005: Access violation reading location 0x00000000.

如果我从我的解决方案调试代码,我永远无法捕获错误,也不会说它有一个未处理的错误。它只是崩溃了。

1 个答案:

答案 0 :(得分:0)

(根据我们在评论中的讨论发布一些'答案')

如果您无法捕获它或记录(不只是捕获异常,将某些内容放入转储 - 您可以转储到临时用户文件夹中)...

我最好的建议,the good old divide and conquer - 删除所有内容(你已经说过只有“标志”导致它),只留下一个按钮,其中包含一个内容 - “返回”所有方法直到你得到一个导致所有问题 - 类似的东西。

(用于色带等的OL XML系统非常容易出错 - 因此您需要检查所有内容(一丝不苟) - 并且OL错误不是很具描述性,大多数时候只是崩溃。顺便说一句,如果你只是删除会发生什么整个上下文菜单?)