「SharpDevelopでExcel用COMアドインを作成する方法」で、SharpDevelopを使ってExcel用のCOMアドインを作成する方法を紹介していますが、「VBAから扱えるDLLをC#で書いてみる。」で書いたように、ソースコードをコンパイルして手動でレジストリに登録すれば良いので、SharpDevelopやVisual StudioといったIDEが無くても、Office用のCOMアドインを作ることができます。
そこで今回は、メモ帳だけを使って(コンパイラやRegAsmは別)Outlook用のCOMアドインを作ってみることにします(Windows 7 x86 + Office 2010 x86環境)。
ソースコードのビルド
まずはC#で適当にコードを書きます。
Guidは「Generate GUIDs online」等のサービスやツールを使って生成したものと置き換えてください。
また、「selectedItem」をdynamicにしていますので、C# 4.0より前の環境でコンパイルする場合には、型を適当にキャストしてください。
・MyOutlookAddIn.cs
namespace MyOutlookAddIn{ using System; using System.Windows.Forms; using System.Runtime.InteropServices; using Extensibility; using Outlook = Microsoft.Office.Interop.Outlook; //Guidは要変更 [ComVisible(true), Guid("367add9b-32f8-403b-b3d2-59f7179f887e"), ProgId("MyOutlook.AddIn")] public class Connect : Object, Extensibility.IDTExtensibility2, IRibbonExtensibility{ private Outlook.Application olApp; private Outlook.Explorer olExplorer; public Connect(){} public void OnConnection(object application, ext_ConnectMode ConnectMode, object AddInInst, ref System.Array custom){ olApp = ((Outlook.Application) application); } public void OnDisconnection(ext_DisconnectMode RemoveMode, ref System.Array custom){ if(olExplorer != null){ Marshal.ReleaseComObject(olExplorer); olExplorer = null; } if(olApp != null){ Marshal.ReleaseComObject(olApp); olApp = null; } GC.Collect(); GC.WaitForPendingFinalizers(); } public void OnAddInsUpdate(ref System.Array custom){} public void OnStartupComplete(ref System.Array custom){} public void OnBeginShutdown(ref System.Array custom){} public string GetCustomUI(string RibbonID){ return @"<?xml version=""1.0"" encoding=""utf-8""?> <customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui""> <contextMenus> <contextMenu idMso=""ContextMenuMailItem""> <button id=""btnSample"" label=""Sample Button"" imageMso=""HappyFace"" onAction=""btnSample_onAction"" /> </contextMenu> </contextMenus> </customUI>"; } public void btnSample_onAction(IRibbonControl control){ try{ olExplorer = (Outlook.Explorer)olApp.ActiveExplorer(); dynamic selectedItem = olExplorer.Selection[1]; MessageBox.Show(selectedItem.Subject); } catch (Exception) { MessageBox.Show("エラーが発生しました。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } [ComImport, ComVisible(true), Guid("000C0396-0000-0000-C000-000000000046"), TypeLibType((short)0x1040)] public interface IRibbonExtensibility{ string GetCustomUI(string RibbonID); } [ComImport, ComVisible(true), Guid("000C0395-0000-0000-C000-000000000046"), TypeLibType((short)0x1040)] public interface IRibbonControl{ [DispId(1)] string Id{get;} [DispId(2)] object Context{get;} [DispId(3)] string Tag{get;} } }
ソースコードの準備ができたら「VBAから扱えるDLLをC#で書いてみる。」の“ソースコードのコンパイル”を参考に、csc.exeでコンパイルを行います。
ただし、上記コマンドを実行しても、下図のようにコンパイルエラーが発生してしまいます。
これは、エラー内容通り指定した名前空間を含むアセンブリへの参照を追加していないためで、解決するには「/reference」オプションで参照を追加する必要があります。
そして、肝心の「Extensibility」と「Microsoft.Office.Interop.Outlook」がどこにあるかというと、「C:\Windows\assembly」以下で見つけることができます。
・・・が、上図の通りエクスプローラーでフォルダを開いてもdllファイルの場所が分かりません。
そこで、コマンド プロンプトから C:\Windows\assembly フォルダ内を検索することで、dllファイルのパスを調べることができます。
dllファイルのパスが分かれば、あとは /reference で指定するだけです。
大分長くなってしまいましたが、これでコンパイルエラーが出なくなりました。
レジストリへの登録
無事にコンパイルできたら、次はレジストリへの登録です。
「VBAから扱えるDLLをC#で書いてみる。」の“RegAsm.exe(アセンブリ登録ツール)によるDLLの登録”を参考に、RegAsm.exeでレジストリへの登録を行います。
アドインとして登録
最後はアドインとして利用できるよう、レジストリの編集を行います。
作業手順は「SharpDevelopでExcel用COMアドインを作成する方法」の“アドインとして登録(レジストリ編集)”を参考にしてください。
キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Outlook\Addins\MyOutlook.AddIn
Description(REG_SZ):メモ帳で作ったOutlook用アドインです。
FriendlyName(REG_SZ):My Outlook AddIn
LoadBehavior(REG_DWORD):3 (スタート時に読み込む)
以上で作業は終了です。
Outlookを起動すると、作成したアドインが読み込まれ、受信トレイのアイテムを右クリックしたときのメニューに「Sample Button」(contextMenu要素の子要素であるbutton要素(btnSample))が追加されます。
以上のように、多少の手間は掛かりますが、メモ帳だけでもOffice用のCOMアドインを作ることができます。
特にOutlookにおいては、他のOfficeアプリケーションに比べてリボンをカスタマイズしづらいので、上記のようなCOMアドインの出番もあるのではないかと思います。
この記事へのコメントはありません。