メイン画像

VBScript - C# で作った COM コンポーネントを使う

VBScript - C# で作った COM コンポーネントを使う


C# で COM コンポーネントを作り、VBScript から利用してみます。

C# で COM コンポーネントを作る

以下の設定で新しいプロジェクトを作ります。

プロジェクトテンプレート: クラスライブラリ (.NET Framework)
ターゲットフレームワーク: .NET Framework 4.8

 

プロジェクトのプロパティを変更します。

  1. アプリケーション → アセンブリ情報 → 「アセンブリを COM 参照可能にする」にチェックを付ける

  2. ビルド → 「COM 相互運用機能の登録」にチェックを付ける

 

インターフェイスを追加します。

ファイル名: IHelloWorld.cs

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace HelloWorldCs
{
    [Guid("★GUIDを入力★")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IHelloWorld
    {
        [Description("ハロー")]
        string SayHello();
    }
}

 

インターフェイスを実装するクラスを追加します。

ファイル名: HelloWorld.cs

using System;
using System.Runtime.InteropServices;

namespace HelloWorldCs
{
    [Guid("★GUIDを入力(インターフェイスとは別のGUID)★")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [ComDefaultInterface(typeof(IHelloWorld))]
    public class HelloWorld : IHelloWorld
    {
        string IHelloWorld.SayHello()
        {
            return "Hello World!";
        }
    }
}

 

プログラムをビルドして、COM コンポーネントは完成です。

COM コンポーネントの配布

作成した COM コンポーネントは登録しないと使えません。

COM を作成した PC で使うとき

何もせずに使うことができます。

Visual Studio が登録まで自動で行ってくれるからです。

別の PC で使うとき

配布した PC で自分で登録してから使う必要があります。

登録(または解除)には RegAsm.exe を使います。

RegAsm.exe で .NET で自作したライブラリを登録/解除する」を参考にしてください。

COM コンポーネントを VBScript から呼び出す

COM コンポーネントを VBScript から呼び出してみます。

CreateObject(名前空間.クラス名) とすることでオブジェクトを作れます。

名前空間 → C# のソースで namespace の後ろに指定した値
クラス名 → C# のソースで class の後ろに指定した値

今回は名前空間が HelloWorldCs 、クラス名が HelloWorld なので、“HelloWorldCs.HelloWorld” を引数として渡します。

With CreateObject("HelloWorldCs.HelloWorld")
    WScript.Echo .SayHello
End With

スクリプトを実行して「Hello World!」が表示されたら成功です。

実行時エラーが起きた場合

Microsoft VBScript 実行時エラー: オブジェクトでサポートされていないプロパティまたはメソッドです。: ‘SayHello’ が起きたときの対処法です。

このエラーは、COM コンポーネントが対応するプラットフォームの違いによるものかもしれません。

 

Visual Studio のメニューバー → ビルド → 構成マネージャーとクリックします。

構成マネージャーのプラットフォームを確認します。

「x86」となっていた場合、スクリプトを実行するプログラムを 32bit 用にしてみてください。

32bit 用のプログラム(cscript.exe)は、通常であれば C:\Windows\SysWOW64\cscript.exe にあるはずです。

 

私の場合はこれが原因でした。

Excel VBA からも使えるようにするため、x86 でビルドしていました。

64bit 用の cscript.exe から 32bit の COM を呼び出そうとして、エラーになっていたわけです。

参考ページ

C# で COM オブジェクトを作ってみる - Qiita

C#でCOM In-Process Server - Qiita


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事