VB.NETでDLLを作成すには?


コテツ  2004-03-21 12:34:36  No: 112445  IP: [192.*.*.*]

教えてください。  言語:VB.NET2002

現在、単純にメッセージを表示するDLLを作成し
EXEから呼び出そうとしているのですが、呼び出す際に「エントリポイントが
見つかりません」というエラーになります。

DLLの呼び出し方法に問題がると思い、API関数を呼び出しテストしてみたので
すが、上手く呼び出されたので、DLLの作成方法に問題があると思っています。

[DLL]
 Public Sub test()
    MessageBox.Show("AAA", "BBB", MessageBoxButtons.OK, _    
    MessageBoxIcon.Information)
 End Sub

[EXE]
Imports System.Runtime.InteropServices



Private Declare Auto Function test Lib "WindowsApplication2.dll" () 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      test()
End Sub

編集 削除
いな  2004-03-21 12:52:49  No: 112446  IP: [192.*.*.*]

"エントリポイントが 見つかりません"

でネット上で検索してみたりはしました?
それぐらいの努力はしましょう。

編集 削除
コテツ  2004-03-21 14:14:27  No: 112447  IP: [192.*.*.*]

いなさん返答ありがとうございます。

とりあえず、ネット上で検索して、解決できなかったので掲示板に載せました。

調べた内容には、EXE側の設定内容が多く、DLLをどのようにすればよいかという内容があまりなかったように思います。(←結構調べたとは思うのですが・・・)
あったとしても、VC++などで言語が違うため理解できませんでした。

編集 削除
ファリンファリン  2004-03-21 14:16:25  No: 112448  IP: [192.*.*.*]

えっと、VB.NETですよね?
参照設定に呼び出したいメソッドのあるDLLを設定し
そのDLLのインスタンスなんか立ててメソッドを呼出すのではだめですか?
例にならいますとこんな感じですね↓

[EXE]
'メンバ変数定義域
Private objDLL As New WindowsApplication2.ClassName
'※例からはクラス名が判断できなかったので仮にClassNameとしてます

'ボタン1押下イベント
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    objDLL.Test()
End Sub

とうしても
>Private Declare Auto Function test Lib "WindowsApplication2.dll" () 
でないといけない理由があったりします?

編集 削除
ファリンファリン  2004-03-21 14:27:06  No: 112449  IP: [192.*.*.*]

追記
ちなみに
>Private Declare Auto Function test Lib "WindowsApplication2.dll" () 
と記述していますが、DLLの中は
>Public Sub test()
ですよね?
Private Declare Auto Sub test Lib "WindowsApplication2.dll" ()
じゃないとダメだったりしません?

編集 削除
コテツ  2004-03-21 14:45:50  No: 112450  IP: [192.*.*.*]

ファリンファリンさん回答ありがとうございます。

>Private Declare Auto Sub test Lib "WindowsApplication2.dll" ()
じゃないとダメだったりしません?

すいません。Subです・・・

>Private Declare Auto Function test Lib "WindowsApplication2.dll" () 
でないといけない理由があったりします?

他の言語で作られたDLLも呼び出したいので、呼び出し方を統一したいんです。
それと、DLLの数が多かっい場合、参照設定はめんどくさいように思います。

>※例からはクラス名が判断できなかったので仮にClassNameとしてます

クラス名が判断って、どのようにやるんですか???

編集 削除
ファリンファリン  2004-03-21 17:09:07  No: 112451  IP: [192.*.*.*]

>クラス名が判断って、どのようにやるんですか???
えっと、そんな小難しいことではなくて
ちゃんと参照設定が出来ていれば、ドットを打った時に出てきますよ。
ただ、『例からはtest()メソッドがどのクラスにあるのか分からなかったので』
と言う意味で『判断』っていいました。
分かりにくくてすみません。

>他の言語で作られたDLLも呼び出したいので、呼び出し方を統一したいんです。
>それと、DLLの数が多かっい場合、参照設定はめんどくさいように思います。
APIやVB6.0で作成したActiveXDLLなら確かに普通に呼べるようですが、
それ以外でDeclareを使って呼出す方法はわたくし個人的には存じません。
申し訳ありません。

編集 削除
.  2004-03-22 12:01:09  No: 112452  IP: [192.*.*.*]

> それと、DLLの数が多かっい場合、参照設定はめんどくさいように思います。
GACに登録しているかどうかにもよりますが、参照設定せずとも、必要なアセンブリを完全限定名を元にしてSystem.Reflection.Assembly に読み込んで、各メソッドを呼び出すような事はできます。ただ、通常は参照設定した方が楽でしょう。共通のInterfaceを最初に用意しておき、各言語のDLLがその共通Interfaceを元に呼び出されるようにすれば、必要な参照設定の数は最低限に減らせますよね。

編集 削除