はじめに
- [C#でCOM In-Process Server]
(https://qiita.com/EvilSpirit39/items/c959fc990d1660b77180) - [VBAまたはVBSからCOM経由で使用できる.NETのライブラリの作成方法]
(https://qiita.com/mima_ita/items/efcd1a6ea86f09047984)
を参考にさせて頂きました。圧倒的感謝……!
環境
- Windows 10 Home (64bit)
- Visual Studio Community 2019
手順
プロジェクトの作成
プロジェクト テンプレート:クラス ライブラリ (.NET Framework) [C#]
プロジェクト名:ClassLibrary1
クラス ライブラリ (.NET Standard)
とは別なので注意。
インタフェースとクラスの作成
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Sample
{
[ComVisible(true)]
[Guid("EC463B16-E298-478E-A836-44585A30F806")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface ITest
{
void Hello(string msg);
}
[ComVisible(true)]
[Guid("A81D546F-6F4E-49E0-9A2B-A9DCC725C489")]
[ProgId("Sample.Test")]
[ClassInterface(ClassInterfaceType.None)]
public class Test : ITest
{
public void Hello(string msg)
{
MessageBox.Show(msg, "Test");
}
}
}
Guid はツールから作成する。
MessageBox を使うのでプロジェクトにアセンブリ参照を追加する。
名前:System.Windows.Forms
アセンブリに署名
プロジェクトのプロパティを開き、署名の「アセンブリに署名する」をチェックする。
キー ファイル:test
署名しなくともRegAsmで警告は出るが登録は可能。
ビルド
ソリューション構成:Release
ソリューション プラットフォーム:Any CPU
ソリューションのビルド。
レジストリに登録
管理者権限の PowerShell やコマンド プロンプトでレジストリに登録する。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm ClassLibrary1.dll /codebase
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm ClassLibrary1.dll /codebase /u
で登録解除。
/tlb
を付けるとCOM一覧に表示されるがC#からは利用できない模様。
dllを直接参照する手もある。
テストプログラム
JScript
var test = new ActiveXObject("Sample.Test");
test.Hello("hello, JScript");
というファイルを用意しダブルクリックする。
クラスに定義した ProgID を指定。