怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

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 を作成した PC で使うとき

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

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

別の PC で使うとき

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

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

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

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

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

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

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

With CreateObject("HelloWorldCs.HelloWorld")    WScript.Echo .SayHelloEnd 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 を呼び出そうとして、エラーになっていたわけです。

参考ページ