【VAOT】複数個のリボンの読み込みを行う

(VAOT Xml Multi Ribbon Load)
一つのアドインの中で、いろんなとこにリボンを追加したい場合にはちょっと一手間と制約があります。

アドインをOutlookなどのOfficeアプリが読み込み時に、対象となるリボン読み込み処理があります。

public partial class ThisAddIn
{
  //アドイン起動時にリボンの読み込みを行う処理
  protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
  {
    return base.CreateRibbonExtensibilityObject();
  }
}

アドイン起動時にCreateRibbonExtensibilityObject()が一度だけ呼ばれます。
"Office.IRibbonExtensibility"を継承したリボンローダーがずっと使われます。

"Office.IRibbonExtensibility"を継承したローダーの実装は、ビジュアルデザイナとXMLデザインでは異なるので一つのアドインの中でビジュアルデザイナとXMLデザインは共存できません。

ビジュアルデザイナ編

ビジュアルデザイナで複数のリボンを読み込むときは、配列にリボンクラスのインスタンス複数渡せばよいので簡単。

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
  return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
    new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { 
      new Ribbon1(),new Ribbon2()});
}

XMLデザイナ編

XMLリボンを複数読み込む場合には、リボンローダーを自分で実装します。

[ComVisible(true)]
public class CustomRibbonLoader : Microsoft.Office.Core.IRibbonExtensibility
{
  #region IRibbonExtensibility メンバー

  public string GetCustomUI(string RibbonID)
  {
    if (RibbonID == "Microsoft.Outlook.Explorer")
    {
      return GetResourceText("OutlookAddIn8.Ribbon1.xml");
    }
    else if (RibbonID == "Microsoft.Outlook.Mail.Compose")
    {
      return GetResourceText("OutlookAddIn8.Ribbon2.xml");
    }
    return "";
  }

  #endregion

  #region ヘルパー

  private static string GetResourceText(string resourceName)
  {
    Assembly asm = Assembly.GetExecutingAssembly();
    string[] resourceNames = asm.GetManifestResourceNames();
    for (int i = 0; i < resourceNames.Length; ++i)
    {
      if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
      {
        using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
        {
          if (resourceReader != null)
          {
            return resourceReader.ReadToEnd();
          }
        }
      }
    }
    return null;
  }
  #endregion
}

"IRibbonExtensibility"を継承したクラスを作ればいいだけですが一つポイント、作成したクラスには必ず[ComVisible(true)]の属性を付与すること。
これを付けないと、読み込まれません。

ComVisibleについて

VSTOを使用して作成したアドインは、COMの上で動きます。
.net言語(マネージ)で記述したクラスオブジェクトをCOMに公開するかの設定になるので、trueを指定します。

やっぱアドイン作るのは、Outlookが一番楽しいよね。