C#で作成したクラスライブラリ(DLL)をMFCで利用する

[C#][VC][MFC]

消えると困るのでコピペ


MFC/C# – C#で作成したクラスライブラリをMFCで利用する

基本

 COMを利用してMFCからC#のクラスを利用する

C#側

 [準備]
  1.プロジェクトプロパティ>ビルド
   「COM相互運用機能の登録」にチェックを入れる
   ※自分でregasmを叩いてtlb作成しても良いけどせっかく便利なものがあるので利用する。

 [ソース]
※本当はIVector3Dとか別途インターフェース作ったほうが良いと思うが今回はインターフェースは作らない
※公開するメソッド/プロパティは全て「public」にすること
※publicだが公開したくないメソッド/プロパティには個別にComVisible(false)を設定する

using System.Runtime.InteropServices;

…

    [ComVisible(true)]
    [ClassInterface( ClassInterfaceType.AutoDual)]
    [Guid("5980BB01-C89B-47C5-927C-418BB89DFE1F")]	// ここはツールの「GUIDの作成」で作った文字にする
    public class Vector3D
    {
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }

 
        public Vector3D()
        {
            X = 1;
            Y = 1;
            Z = 1;
        }

 
        public double Length()
        {
            return Math.Sqrt(X * X + Y * Y + Z * Z);
        }

 
        public double LengthSq()
        {
            return X * X + Y * Y + Z * Z;
        }
    }

MFC側

1.VS上で右クリック>クラスの追加>“TabLibからクラスの追加“を選択
 → コンボボックスから今回作成したtlbを選択

2.tlbを選択するとその中に含まれているインターフェースが出てくるので
 「_Vector3D」を追加して完了ボタンを押下する
 → CVector3D.hが追加される
3.CVector3D.hを開いて
 #import xxxx
 という一行が存在する。
 ここに named_guides raw_interfaces_onlyを追加する

 #import “xxxx\SimpleControl.tlb” no_namespace named_guids raw_interfaces_only

 ※named_guids 
  CLSID、IIDの定義を自動生成してくれる(CLSID_クラス名)
 ※raw_interfaces_only
  COMインターフェースの定義を自動生成してくれる

4.実際に使ってみる

// お約束コード

CoInitialize(0);

 

CVector3D cls;

if (cls.CreateDispatch(CLSID_Vector3D) != FALSE)

{
    cls.put_X(10);
    cls.put_Y(5);
    cls.put_Z(3);
    if (cls.Length() == sqrt((double)(10*10 + 5*5 + 3*3)))
    {
        printf("SUCCESS\n");
    }
    else
    {
        printf("FAILED\n");
    }
    // 後片付け
    cls.ReleaseDispatch();

 

// お約束コード

CoUninitialize();

※追記
 CoCreateInstance 又は CreateDispatchを行わずに自動生成された
 クラスを利用しようとしても正しく動作しないので注意。
 → 正常に動作しているかのように見えるためわかりにくかったりする。
  (実行時エラーになる場合もある)



ネタ元