VS2008 SP2 での Excel 2003 アドイン開発~導入まとめ
私用ですが、反復法でしか求根できない解を、単位時間あたり大量に求める必要があり、Excel VBAじゃ遅いから。と、 C# に逃がすべく Excel 2007 用アドインを開発したことがあったんですが、Excel 2007 側の不甲斐なさ等々、いろいろありまして、最近これを Excel 2003 用アドインに移植したので、いろいろをメモしておきます。
今回は、Application-Level Add-Ins の形で開発しました。
詳しくは以下から。
巻末の参考文献をご参照いただければ分かると思いますので、本記事に関しては、質問めいたコメントはご遠慮ください。
<COMアドイン導入するクライアント側>
■ 事前にインストールしておくもの。
- Excel2003 セットアップ時「.NET プログラミング サポート」を要インストール(PIA プライマリ相互運用アセンブリ)
- Visual Studio 2005 Tools for Office Second Edition Runtime
- Microsoft .NET Framework 3.5 Service Pack 1
■ 設定の確認
- Excel2003での「COMアドイン」確認
「表示」→「ツールバー」→「ユーザー設定」→「コマンド」タブ→分類「ツール」→
コマンド「COMアドイン」をツールバーに配置。 - 導入したCOMアドインに対して、適切なコードアクセスセキュリティポリシーが設定されているか。
→ caspol.exe または「Microsoft .NET Framework 2.0 Configuration」から、ランタイムセキュリティポリシーを設定
■ 動かない場合の確認方法
- システム環境変数 VSTO_SUPPRESSDISPLAYALERTS を追加し、値を0にセット
→ COMアドインロード時のエラーが表示されるようになる。 - \HKLM\SOFTWARE\Microsoft\Fusion!EnableLog (DWORD)の値を1にする
→ アセンブリバインドエラーが確認できるようになる。
→ パフォーマンスのロスがあるので、確認後はキーを削除する事。 - Microsoft .NET Framework 2.0 Configuration の導入
→ 「.NET Framework Version 2.0 Software Development Kit」を導入
→ (導入するSDKは32bit版。CASは64bitと32bitとで別。)
→ SDKコマンドプロンプトから、「mscorcfg.msc」コントロールパネル → 管理ツール → Microsoft .NET Framework 2.0 構成
で、「.NET Framework 2.0 Configuration」
ランタイムセキュリティポリシー → ユーザー → コードグループ → All_Code → 右クリック「新規作成」コードグループ名: ご自由に。
メンバーシップ条件:「URL」「C:\Program Files\{インストール先パス}\*」
アクセス許可セット:「FullTrust」
<VisualStudio 2008側>
- プロジェクト作成時は「Excel2003アドイン」のテンプレートを使用
- セットアッププロジェクトは自動作成のものをそのまま使用
- インストール時のレジストリ等の設定は、セットアッププロジェクトを右クリック→表示から(初期状態のままでよい。)
- Excel2003アドインは、Windows Installer でのみ導入可能。ClickOnceは利用できない。
■ プログラミングの肝
- ThisAddIn.cs で、RequestComAddInAutomationService を override し、公開クラスのインスタンスを生成し、返す。
private MathEngine mathEngine;
// VBA <-> VSTO 相互運用コード
protected override object RequestComAddInAutomationService()
{
if (mathEngine == null)
mathEngine = new MathEngine();return mathEngine;
}
- COM公開クラスはこんな感じ
namespace ExcelAddIn
{[System.Runtime.InteropServices.ComVisibleAttribute(true)]
[System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMathEngine
{
double calcBsUltima( double ul);
}[System.Runtime.InteropServices.ComVisibleAttribute(true)]
[System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)]
public class MathEngine : IMathEngine
{
~MathEngine() {}public double calcBsUltima(double ul )
{
result = OFMath.bs_ultima(ul);
return result;
}
}
}
<Excel 2003の設定>
- 「ツール」→「オプション」→「リンクの自動更新前にメッセージを表示する」
のチェックをOFF
(COMアドインの動作には不要だが、今回の私の用途で必要だったので。)
<参考文献>
チュートリアル : アプリケーション レベルのアドインのコードを VBA から呼び出す
Architecture of Application-Level Add-Ins
Deploying Application-Level Add-Ins (2003 System)
Deploying Office Solutions (2003 System)
Registry Entries for Application-Level Add-Ins
Visual Studio Tools for Office Runtime Overview
コード アクセス セキュリティ ポリシー ツール (Caspol.exe)
コードアクセスセキュリティの仕組みと設定方法 - japan.internet.com
Creating Solutions for Multiple Versions of Microsoft Office
[PRB] Office の [COM アドイン] ダイアログ ボックスに Visual Studio .NET 共有アドインが表示されない
以上。