VBScript - C# で作った COM コンポーネントを使う
VBScript - C# で作った COM コンポーネントを使う
C# で COM コンポーネントを作り、VBScript から利用してみます。
C# で COM コンポーネントを作る
以下の設定で新しいプロジェクトを作ります。
プロジェクトテンプレート: クラスライブラリ (.NET Framework)
ターゲットフレームワーク: .NET Framework 4.8
プロジェクトのプロパティを変更します。
-
アプリケーション → アセンブリ情報 → 「アセンブリを COM 参照可能にする」にチェックを付ける
-
ビルド → 「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 を呼び出そうとして、エラーになっていたわけです。
参考ページ
アカウントを作成 して、もっと沢山の記事を読みませんか?
この記事にコメントをしてみませんか?