.NETで作成したDLLをVB6から呼び出す方法

用語解説

COMオブジェクト
COMコンポーネント=ActiveX
アセンブリ
.NetFrameworkで作成されたオブジェクト
GUID
GlobalUniqueIdentifier
世界中で一意な識別子。
MACアドレス等。
単にGUIDと呼ぶ場合は、WindowsにおけるオブジェクトのクラスIDを指す。

コーディング(.Net側)

DLLとしてコンパイル(ビルド)する。⇒test.dll
using System.Runtime.InteropServices;
namespace nsFromVB6
{
  [ComVisible(true)]
  public interface INmcTagger
  {
    string ReturnMessage();
  }
  [ClassInterface(ClassInterfaceType.None)]
  public class clsFromVB6 : INmcTagger
  {
    public string ReturnMessage()
    {
      return @"VB6からの呼びだし成功";
    }
  }
}

.Net側設定

(1) [プロジェクト]-[XXX のプロパティ]-[アプリケーション]タブの[アセンブリ情報]
アセンブリを COM 参照可能にする」にチェックを入れておく
(2) ビルドにてプラットフォームのターゲットを「x86」とする。
(3) ビルドにて「COM相互運用機能の登録」にチェックをつける。
(4) ビルドにて署名を作成する

COM登録

RegAsm.exeを実行
※COMとして利用できる様にレジストリに登録する
コマンドプロンプトにて.NetFrameworkのインストールフォルダのRegAsm.exeを実行
(例) cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
regasm test.dll /tlb /codebase

※/codebaseを行う為には署名を作成しておくことが必要

VB6からの参照設定

VB6から利用する為にはタイプライブラリ(クラスの型情報ファイル)が必要
※署名を作成している場合は自動で作成されるので不要
コマンドプロンプトにて
tlbexp test.dll
例:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\tlbexp.exe
※test.tlbが作成される
設定後、VB6の「参照設定」からtest.tlb を読み込む。

コーディング(VB6)

Private Sub Form_Load()
  Call CallDotNet
End Sub
Private Sub CallDotNet()
  On Error GoTo Err_Trap
  
  Dim obj As clsFromVB6
  Set obj = New clsFromVB6
  Call MsgBox( obj.ReturnMessage )
  
  Exit Sub
Err_Trap:
  MsgBox (Err.Description)
End Sub