• ベストアンサー

C# DLL エントリ ポイントが見つかりません。

C#で作成したDLLをC#から呼出したいのですが、うまくいきません。 // トリガ private void button2_Click(object sender, EventArgs e) { string ans = DLL.moji(); MessageBox.Show(ans); } // DLL呼出し用クラス class DLL { [DllImport("LibCsharp.dll")] public static extern string moji(); } // DLL(LibCsharp.dll内容) class AddClass { public static string moji() { return ("テスト"); } } 上記で実行すると「EntryPointNotFoundException DLL 'LibCsharp.dll' の 'moji' というエントリ ポイントが見つかりません。」となります。 プロジェクトの参照設定にはLibCsharpを追加しています。 Web上で調べたのですが、解決には至っておりません。 申し訳ありませんが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#1です。 私もc#で簡易な独自ライブラリを構築しようとしていたので調べてみました。 結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。 (「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択) まず基本的な知識としてdllには3種類あると覚えて下さい。 ・レガシー(古い遺産)dll ・active-x dll ・.net dll 私はレガシーdll時代の知識しかありませんでした。 この頃のdllを使用するためには、dll本体以外に以下のファイルが必要でした。 ・ヘッダファイル ・ライブラリ(lib)ファイル ・defファイル(場合による) c#で作られたdllは[.net dll]となり、[.net freamwork]上で動作する各種の言語で使用出来るようにするため、煩わしいlibファイルやヘッダファイル等を削除する方向でdllが進化しているのだと思われます。 ネット検索をしていて見つけたのですが、[.net dll]で作成されたFTPクライアントのライブラリがありました。 (.NET用FTPクラスライブラリ (TKFP.DLL) ) どの言語で作られているのか分かりませんが、[.net dll]で作られているため、c#およびvbで使用可能のようです。 追加したdll内に含まれているクラスや関数に対してオブジェクトブラウザで概要が表示出来るようにXMLファイルで概要を記述出来るようなのですが、詳細まで調べることが出来ませんでした。 (申し訳ありません。)

1192296jp
質問者

お礼

応答が遅くなり、大変申し訳ありません。 >結果として参照の追加でdllを直接、指定するだけで使用可能だと分かりました。 >(「参照設定」右クリック→「参照の追加」→「参照」タブ選択→DLLを選択) できれば、呼出しができた時のサンプルを載せていただけるとありがたいです。 最初の質問にも記載しましたが、参照設定に追加した場合の動作が確認できておりません。 >プロジェクトの参照設定にはLibCsharpを追加しています。 >まず基本的な知識としてdllには3種類あると覚えて下さい。 いろいろ教えていただき、ありがとうございます。 サンプルのほう、よろしくお願いいたします。

1192296jp
質問者

補足

using LibCsharp; 上記を追加することで確認できました。 ありがとうございました。

その他の回答 (5)

回答No.6

>C#で作成された単体のDLL 同じ方法でできます。 どんなクラスがあって、どんなメンバがいるのかはオブジェクトブラウザで確認してください。

1192296jp
質問者

お礼

回答が遅くなって申し訳ありません。 とりあえず、試してみます。

回答No.4

参考になりますか? クラスライブラリの作成と使用方法 http://www.geocities.jp/gakaibon/tips/csharp2008/classlibrary-make.html

1192296jp
質問者

お礼

ありがとうございます。 上記URLを参照することで、自作のものを使用することができました。 // トリガ using LibCsharp; private void button2_Click(object sender, EventArgs e) { string ans = AddClass.moji(); MessageBox.Show(ans); } ただ、自作ではないもの(DLLしかない状態)で呼び出す方法もご教授いただけると大変助かります。 ひょっとして同じ方法でできるのでしょうか。

回答No.3

#1です。 駄目なら、あとはネームスペースかな? [AddClass]クラスは、なにかのネームスペース内で宣言されていると思います。 仮に[MyNameSpace]とします。 それを、[button2_Click]関数が記述されているソースコードの先頭で、[using MyNameSpace]と記述する必要があったのでは無かったかと思います。

1192296jp
質問者

お礼

ありがとうございます。 bluecampusさんの紹介してくださったURLに同様の内容がありました。 bluecampusさんにもお願いしていますが、C#で作成された単体のDLLを呼び出す方法もご教授いただけるとありがたいです。 重ね重ね、ご迷惑おかけします。

回答No.2

>C#で作成したDLL の場合DllImportでは使えないのでは? (DllImportを使うのは(C++等で作成した)レガシDLLだけ。) 参照設定でやるのではないでしょうか?

1192296jp
質問者

お礼

参照設定に追加することでコード記述を変える必要はないのでしょうか。 とりあえず参照設定に追加してみましたが、同じエラーが出てしまいます。 引き続き、ご指導いただけたらありがたいです。

回答No.1

まず、試してはいない事を念頭に置いて下さい。 [LibCsharp.dll]の[moji]関数は[AddClass]クラスのメンバ関数ですよね。 呼び出す側は[moji]だけで呼び出そうとしていますが、それが[AddClass]内にあっては直接呼び出せないのではないかと思います。 以下で呼び出せるのではないかと思うのですが。。。 --------- // トリガ [DllImport("LibCsharp.dll")] private void button2_Click(object sender, EventArgs e) {  string ans = AddClass.moji();  MessageBox.Show(ans); }

1192296jp
質問者

お礼

上記サンプルの通り試してみましたが、エラーが発生してしまいました。 名前 'AddClass' は現在のコンテキスト内に存在しません。 引き続きご助言いただければありがたいです。

関連するQ&A

専門家に質問してみよう