C#で実装したコードをVBAとかVBから使う方法
■環境
 Visual Studio2008 Pro
 .NET Framework 2.0 を対象とする。
 32ビットのOffice2010から使用すること



■手順
1. Visual Studio 2008 を管理者権限で起動する。
 これはCOM登録時にレジストリを変更するため。
 


2.プロジェクトの追加で「.NET Framework 2.0」 と 「クラスライブラリ」を選択
b0232065_03304192.png


3. ビルドにてプラットフォームのターゲットをx86とする。
b0232065_03320476.png



4. ビルドにてCOM相互運用機能の登録にチェックをつける。
b0232065_03335478.png


5. アプリケーションのアセンブリ情報で、「アセンブリをCOM参照可能にする

b0232065_03340744.png

6. 公開したいインターフェイスとその実態について以下のように記述する
using System.Runtime.InteropServices;
namespace NMeCabCom
{
    [ComVisible(true)]
    public interface INmcTagger
    {
        void Create();
        NmcNode[] Parse(string text);
    }
   
    [ClassInterface(ClassInterfaceType.None)]
    public class NmcTagger : INmcTagger
    {
        private MeCabTagger nmcab;
        public NmcTagger()
        {
        }

        public void Create()
        {
            MeCabParam p = new MeCabParam();
            p.DicDir = @"C:\dev\NMeCab\dic\ipadic";

            this.nmcab = MeCabTagger.Create(p);
        }

        public NmcNode[] Parse(string text)
        {
            List<NmcNode> result = new List<NmcNode>();
            if (this.nmcab == null)
            {
                return result.ToArray();
            }
            MeCabNode node = this.nmcab.ParseToNode(text);
            while (node != null)
            {
                result.Add(new NmcNode(node));
                node = node.Next;
            }
            return result.ToArray();
        }
   
    }
}
まず、公開するインターフェイスの直前に「ComVisible(true)」と記述する。
    [ComVisible(true)]
    public interface INmcTagger
    {
        void Create();
        NmcNode[] Parse(string text);
    }


そして、そのインターフェイスの実装部分はClassInterfaceType.Noneとする。
    [ClassInterface(ClassInterfaceType.None)]
    public class NmcTagger : INmcTagger



7. ビルドを行うことでCOMの登録まで行われる


8. ExcelVBA側で参照設定してやれば、使用できるようになる
b0232065_03370741.png
b0232065_03373653.png







■別の環境への適用方法

.NET Frameworkのフォルダに存在するregasmを使用する。
作成したdllに対して /tlb/codebase を付与してregasmを実行する。
regasmは各バージョンの.NETに存在する。

SET BIN=C:\Windows\Microsoft.NET\Framework\v2.0.50727

REM 登録
%BIN%\regasm  C:\dev\NMeCabCom\NMeCabCom\bin\Debug\NMeCabCom.dll /tlb /codebase


この際、以下のメッセージが出力される場合がある。
「RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピュータにインストールされるその他のアプリケーションとの競合が生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。」

これは、警告だけであり、COMの登録はされている。
この警告を消すには、プロジェクトの設定で「署名」→「アセンブリの署名」 厳密な名前のキーファイルを選択する必要がある。

b0232065_03400617.png


依存するすべてのDLLが同様に厳密な名前を有しなければならないので気をつけること。


■COMの削除方法
下記の/tlb と /unregister を付与したregasmコマンドを実行後、ファイルを消す

regasm /tlb C:\dev\NMeCabCom\NMeCabCom\bin\Debug\NMeCabCom.dll  /unregister




[PR]
by mima_ita | 2013-11-23 03:42 | .NET
<< C#で実装したコードをVBSか... VBAで文字のescapeとu... >>



実験ですお
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ