「SharpDevelopのインストールと日本語化」で紹介しているSharpDevelopには、COMアドインを作るためのテンプレートが用意されているので、Officeアプリケーションで使えるCOMアドインを簡単に開発することができます。
Excel用COMアドインの作成方法
※ 下記は日本語化したSharpDevelopを元に説明しています。
- 管理者権限でSharpDevelopを起動します。管理者権限で起動しないと、ソリューションのビルド時に“Cannot unregister assembly”エラーが発生します。
- ファイルメニューの「新規作成」から「ソリューション」をクリックします。
- 新しいプロジェクトダイアログの「テンプレート」から「共有アドイン」を選択し、ソリューションの名前(今回はMySampleAddIn)を入力後「新規」ボタンをクリックします。
- 「プロジェクト」から「Microsoft.Office.Interop.Excel」と「System.Windows.Forms」への参照を追加します。
- 「Connect.cs」ファイルに下記コードを入力した後、F8キーを押して、ソリューションのビルドを実行します。
- ビルドが終了し、DLLファイルが作成されれば作業終了です。
namespace MySampleAddIn { using System; using System.Windows.Forms; using System.Runtime.InteropServices; using Extensibility; using Excel = Microsoft.Office.Interop.Excel; [GuidAttribute("0BD47D5A-31BF-4217-AF21-B2DD5B0255D5"), ProgId("MySampleAddIn.Connect")] [ComVisible(true)] public class Connect : Object, Extensibility.IDTExtensibility2, IRibbonExtensibility { private Excel.Application exApp; private Excel.Worksheet exSht; private Excel.Range exRng; public Connect() { } public void OnConnection(object application, ext_ConnectMode ConnectMode, object AddInInst, ref System.Array custom) { exApp = ((Excel.Application) application); } public void OnDisconnection(ext_DisconnectMode RemoveMode, ref System.Array custom) { if (exRng != null) { Marshal.ReleaseComObject(exRng); exRng = null; } if (exSht != null) { Marshal.ReleaseComObject(exSht); exSht = null; } if (exApp != null) { Marshal.ReleaseComObject(exApp); exApp = 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/2006/01/customui""> <ribbon> <tabs> <tab id=""tabSample"" label=""Sample Tab""> <group id=""grpSample"" label=""Sample Group""> <button id=""btnSample"" label=""Sample Button"" size=""large"" imageMso=""HappyFace"" onAction=""btnSample_onAction"" /> </group> </tab> </tabs> </ribbon> </customUI>"; } public void btnSample_onAction(IRibbonControl control) { try { exSht = (Excel.Worksheet)exApp.ActiveSheet; exRng = (Excel.Range)exSht.Cells[1, 1]; exRng.Value = "呼び出し元のコントロールIDは「" + control.Id + "」です。"; } 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;} } }
DLLファイルの作成が終了したら、今度はRegAsm.exe(アセンブリ登録ツール)を使ってDLLを登録する必要があります。
DLLファイルの登録
- 管理者権限でコマンドプロンプトを実行します。
- 下記コマンドを実行して「RegAsm.exe」ファイルがあるフォルダに移動します。RegAsm.exeファイルがあるフォルダは、環境によって異なる場合があります。
- 「RegAsm “(SharpDevelopで作成したDLLファイルのパス)” /tlb /codebase」コマンドを実行して、DLLファイルの登録を行います。
cd "C:\Windows\Microsoft.NET\Framework\v4.0.30319"
RegAsm "C:\SharpDevelop Projects\MySampleAddIn\MySampleAddIn\bin\Debug\MySampleAddIn.dll" /tlb /codebase
RegAsm.exeによるDLLファイルの登録が終了したら、今度はExcelからアドインとして使えるよう、レジストリを変更する必要があります。
アドインとして登録(レジストリ編集)
- レジストリエディタを起動します。
- 「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Excel\Addins」以下に「MySampleAddIn.Connect」キーを新規追加します。
- 2.で追加した「MySampleAddIn.Connect」キーに下記エントリを追加します。
Description(REG_SZ):COMアドインの説明。今回は「SharpDevelopで作ったサンプルアドインです。」
FriendlyName(REG_SZ):COMアドインの表示名。今回は「My Sample AddIn」
LoadBehavior(REG_DWORD):COMアドインの読み込み方法。今回は「3」(スタート時に読み込む)
以上で作業は終了です。
上記作業後Excelを起動すると、作成したアドインが読み込まれ、「Sample Tab」にある「Sample Button」も動作することが確認できます。
アドインの登録解除方法
アドインの登録を解除する場合は、下記のような作業を行う必要があります。
- レジストリエディタを起動し、アドイン登録時に追加したキー(上記手順の場合は「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Excel\Addins\MySampleAddIn.Connect」キー)を削除します。
- 管理者権限でコマンドプロンプトを起動します。
- 「RegAsm.exe」ファイルがあるフォルダに移動します。
- 「/u」オプションを付けてRegAsm.exeを実行し、DLLファイルの登録を解除します。
RegAsm "C:\SharpDevelop Projects\MySampleAddIn\MySampleAddIn\bin\Debug\MySampleAddIn.dll" /tlb /u
参考Webページ
- Add-ins for Multiple Office Versions without PIAs
- http://blogs.msdn.com/b/andreww/archive/2008/06/03/add-ins-for-multiple-office-versions-without-pias.aspx
- Excel から使うマネージDLL を作る。
- http://supermab.com/wp/excel-%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8dll-%E3%82%92%E4%BD%9C%E3%82%8B%E3%80%82/
- Visual Studio .NET による Office マネージ COM アドインの作成
- https://msdn.microsoft.com/ja-jp/library/dd313948.aspx
- アプリケーション レベルのアドインのレジストリ エントリ
- https://msdn.microsoft.com/ja-jp/library/bb386106.aspx
- 【NetOffice】リボンの実装からCOMテクノロジをのぞき見る。
- http://pro.art55.jp/?eid=1304126
- IRibbonExtensibility.cs
- https://github.com/CaioProiete/NetOffice/blob/master/Source/Office/DispatchInterfaces/IRibbonExtensibility.cs
- IRibbonControl.cs
- https://github.com/CaioProiete/NetOffice/blob/master/Source/Office/DispatchInterfaces/IRibbonControl.cs
おわりに
というわけで、SharpDevelopを使ってCOMアドインを作成してみました。
リボンUIの実装に若干手間取りましたが、参考Webページのおかげで何とか解決できました(動作確認だけしたかったので、インターフェースはかなり適当です)。
.NETからのExcel云々という話は、昔、COM参照の解放し忘れでプロセスが残り続ける問題で苦労した覚えがあるのですが、共有アドインの場合はどうなんでしょう…?一応OnDisconnectionにReleaseComObjectを入れましたが、このあたりの“お作法”についてはどうするのが一番良いのかイマイチ分かりません(^^;
また、RegAsmでDLLを登録したり解除したり、という作業は結構面倒くさいです。
4年ほど前にこの作業を簡略化するためのスクリプトを書いたことがあるので、興味がある方は下記記事もご覧ください。
・ドラッグされたマネージドDLLをRegAsmで登録するスクリプト
https://kinuasa.wordpress.com/2011/04/07/%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%81%95%E3%82%8C%E3%81%9F%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%89dll%E3%82%92regasm%E3%81%A7%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA/
この記事へのコメントはありません。