VB2005で作成したDLLをVB6で使用するには?


TCN  2008-07-03 14:11:58  No: 140012  IP: 192.*.*.*

VB2005でコンパイルしたDLLをVB6の参照設定から呼び出そうとすると、
「指定したファイルの参照は登録できません」となります。
どうしたら良いのでしょうか?

編集 削除
 2008-07-03 16:14:22  No: 140013  IP: 192.*.*.*

VB6までのDLL参照方法と、.NETでの参照方法は内部的に随分違うらしい
.NETでAPIを使ったりする際に問題になることが多いが、
変数のサイズなんかだけでなく、例えば構造体のメモリ内部での構造なんかも
変わってるので、.NETで構造体使うAPI呼び出す際は、わざわざ強制的に
「昔の形の構造体で」みたいな定義をしないとまともに動かなかったりする

そんな違いがあるので、.NETの方は何とか昔のものも動かせるように
互換性を残してるが、それは基本的に「特例」と思われるので
逆方向の互換性は保たれないと思った方が良いかもしれない
もしかしたら、2005側のDLL定義で、前述した「強制的な」互換定義を
使うことによって、VB6でも使えるDLLが作れるかもしれないが… やったことはないな

ちなみにVB2005側の話としては
System.Runtime.InteropServices 名前空間
MarshalAsAttribute クラス
UnmanagedType 列挙体
…あたりがキーワードになるはずだが…正直私もあんま理解できてない

編集 削除
オショウ  2008-07-03 18:53:00  No: 140014  IP: 192.*.*.*

どうしても2005で作成したDLLを使いたいというのであれば
2005側のDLLをCOM公開する設定をしてインターフェースを
組むか、もしくは、COMラッパーDLLを作成してVB6と2005DLL
を中もちさせるものが必要です。

何にせよCOMのインターフェースの定義等理解しないとVB6から
呼び出せないので・・・その辺調べてチャレンジして下さい。

以上。

編集 削除
魔界の仮面弁士  2008-07-03 23:38:36  No: 140015  IP: 192.*.*.*

>「指定したファイルの参照は登録できません」となります。

ComVisible 属性が True になっている事を確認してください。

本来、これの初期値は True ですが、VB2005 の場合、自動的に
AssemblyInfo.vb ファイルにて、
  <Assembly: ComVisible(False)>
の指定が行われていますので、この設定を書き換えるか、もしくは
公開クラスに <ComVisible(True)> 属性をつける必要があります。

# AssemblyInfo.vb を表示するには、[ソリューション エクスプローラ]の
# [すべてのファイルを表示]アイコンを押してください。


そして DLL は、EXE と同じフォルダに配置するようにしてください。
開発環境からの実行時は、VB6.EXE のディレクトリに配置します。
(GAC に登録して使う方法もありますが、それだといろいろと面倒なので…)


なお、参照設定して使う場合、バイナリ互換を維持する必要があるため、
幾つか気をつけるべき内容があります。下記を参考にしてみてください。
(VB.NET 2002 当時の資料なので、多少の違いはありますけれども)
http://www.sev.or.jp/ijupiter/world/dc_interrop/dotnet_com_interrop.html

編集 削除
 2008-07-04 08:31:20  No: 140016  IP: 192.*.*.*

あら…参照方法以前の問題があったのですな
失礼しました
(ほとんど使うことはない気がするが…私も一応憶えとこ)

編集 削除
魔界の仮面弁士  2008-07-04 11:26:48  No: 140017  IP: 192.*.*.*

書き忘れ。

>  <Assembly: ComVisible(False)>
> の指定が行われていますので、この設定を書き換えるか

AssemblyInfo.vb を直接書き換える代わりに、
ソリューション エクスプローラの [My Project] を開いて
[アプリケーション]タブの[アセンブリ情報]ボタンから
  『アセンブリを COM 参照可能にする』
のチェックを付ける形でも OK です。

# 普段、直接編集の方を多用しているので、設定画面の存在を
# 失念していました…。m(_ _;)m

編集 削除