VB2005でコンパイルしたDLLをVB6の参照設定から呼び出そうとすると、
「指定したファイルの参照は登録できません」となります。
どうしたら良いのでしょうか?
VB6までのDLL参照方法と、.NETでの参照方法は内部的に随分違うらしい
.NETでAPIを使ったりする際に問題になることが多いが、
変数のサイズなんかだけでなく、例えば構造体のメモリ内部での構造なんかも
変わってるので、.NETで構造体使うAPI呼び出す際は、わざわざ強制的に
「昔の形の構造体で」みたいな定義をしないとまともに動かなかったりする
そんな違いがあるので、.NETの方は何とか昔のものも動かせるように
互換性を残してるが、それは基本的に「特例」と思われるので
逆方向の互換性は保たれないと思った方が良いかもしれない
もしかしたら、2005側のDLL定義で、前述した「強制的な」互換定義を
使うことによって、VB6でも使えるDLLが作れるかもしれないが… やったことはないな
ちなみにVB2005側の話としては
System.Runtime.InteropServices 名前空間
MarshalAsAttribute クラス
UnmanagedType 列挙体
…あたりがキーワードになるはずだが…正直私もあんま理解できてない
どうしても2005で作成したDLLを使いたいというのであれば
2005側のDLLをCOM公開する設定をしてインターフェースを
組むか、もしくは、COMラッパーDLLを作成してVB6と2005DLL
を中もちさせるものが必要です。
何にせよCOMのインターフェースの定義等理解しないとVB6から
呼び出せないので・・・その辺調べてチャレンジして下さい。
以上。
>「指定したファイルの参照は登録できません」となります。
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
あら…参照方法以前の問題があったのですな
失礼しました
(ほとんど使うことはない気がするが…私も一応憶えとこ)
書き忘れ。
> <Assembly: ComVisible(False)>
> の指定が行われていますので、この設定を書き換えるか
AssemblyInfo.vb を直接書き換える代わりに、
ソリューション エクスプローラの [My Project] を開いて
[アプリケーション]タブの[アセンブリ情報]ボタンから
『アセンブリを COM 参照可能にする』
のチェックを付ける形でも OK です。
# 普段、直接編集の方を多用しているので、設定画面の存在を
# 失念していました…。m(_ _;)m