2010年11月11日星期四

.NetのDLLをCOMにして、VB6に使うように

.Net作成されたDLLをCOMとして使えるように、以下とステップ:
① .netでDLLを作成する。
    VS2005などIDEで行う。
  
② CMDよりregasm.exeでDLLファイルの型をレジストする。
  CMD例:
  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe Wxg.dll /tlb /codebase
  注意点: /tlbが必要です、これがあればWxg.tlbファイルを生成できます。
      後でEXCELのVBAやVB6のIDEの参照メニューからtlbファイルを参照する必要です。
      直接wxg.dllを参照するのはできないです。
      /codebaseは署名に関するものです、なくても大丈夫そうです。
      逆にあったら、署名ファイルを提供する必要です。

③ EXCELのVBAやVB6の「参照設定」からWxg.tlb を読み込む。
  これでVBの統合開発環境上で各クラスを呼び出す準備が整った事になる。

④ VB6ソースの中で、Dimで変数を宣言して使える。
  ただ補完機能ができないです。
  できるようにするにはClassInterface属性にClassInterfaceType.Noneを設定する。
  例:
  [ClassInterface(ClassInterfaceType.None)]
   public class GroupReplace : IReplacer

 さらにVB6中で.net DllのEventも使えようとすると、
 先に.netのEvent interfaceを宣言しなければなりません。
 例:
 public delegate void ReplaceEventHandler( string name );
 [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
 public interface ReplaceEvents
 {
   void Replaced( string input, string format );
 }
 次にComSourceInterfaces属性を使ってクラス側にそのインターフェイス名を指定する。
 [ComSourceInterfaces("Wxg.ReplaceEvents, Wxg")]
 [ClassInterface(ClassInterfaceType.None)]
 public class GroupReplacer: IReplacer
 {
   public event ReplaceEventHandler Replaced;
  }
   ComSourceIntarfaces属性値の引数は、最初がイベント用に定義したインターフェイス名、
   二番目がそのインターフェイスが存在するアセンブリ名である。
   これでVB6からイベントを利用できるようになる。

⑤ 一回でRegasmでレジストした後、また.netソースが改修しても再びRegasm不要のため
  dllのClassIDを固定GUIDで設定すればOKです。
  GUIDの生成はVS2008のTOOLsメニューGUID生成からできます。

没有评论: