last update

VS2008 SP2 での Excel 2003 アドイン開発~導入まとめ

私用ですが、反復法でしか求根できない解を、単位時間あたり大量に求める必要があり、Excel VBAじゃ遅いから。と、 C# に逃がすべく Excel 2007 用アドインを開発したことがあったんですが、Excel 2007 側の不甲斐なさ等々、いろいろありまして、最近これを Excel 2003 用アドインに移植したので、いろいろをメモしておきます。

今回は、Application-Level Add-Ins の形で開発しました。

詳しくは以下から。

巻末の参考文献をご参照いただければ分かると思いますので、本記事に関しては、質問めいたコメントはご遠慮ください。

<COMアドイン導入するクライアント側>

■ 事前にインストールしておくもの。

■ 設定の確認

  • 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)

Deploying Office Solutions

Deploying Visual Studio 2005 Tools for the Office System SE Solutions Using Windows Installer- Walkthroughs (Part 2 of 2)

Registry Entries for Application-Level Add-Ins

Visual Studio Tools for Office Runtime Overview

コード アクセス セキュリティ ポリシー ツール (Caspol.exe)

コードアクセスセキュリティの仕組みと設定方法 - japan.internet.com

ダウンロードの詳細 - Microsoft Visual Studio 2005 Tools for Office Second Edition Runtime (build 8.0.50727.891) (x86)

Creating Solutions for Multiple Versions of Microsoft Office

[PRB] Office の [COM アドイン] ダイアログ ボックスに Visual Studio .NET 共有アドインが表示されない

登録を必要としない COM 相互運用機能

登録を必要としない COM 相互運用機能の要件

以上。

コメントを記入