• ベストアンサー

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

  • C++で作ったDLLをC#で使うには?

    C#でC++で書いたDLLを使いたいと思っていますが、可能でしょうか? 本で調べてみると出来ると思って挑戦しています。 public class Form1 : System.Windows.Forms.Form { [DllImport("test.dll")] public static extern long abc(); ..... と宣言し、使う時には long a = abc(); としています。 しかし、いざデバッグして実行してみると、エントリポイントが見つかりません。と表示されてしまいます。 (そもそもDLLが使えるのならばですが)できればC#でC++のDLLが使いたいため、詳しい方ご教授願います。

  • C#から、C++作成dll内の関数を呼び出す方法

    C#から、C++で作成したdll内の関数を呼び出す方法は、以下の方法で実現できました。(メッセージボックスで "10" が表示されました) [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API int fnCppDll(); #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API int fnCppDll() { return 10; } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern int fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n = fnCppDll(); MessageBox.Show(n.ToString()); } } } 今回お聞きしたいのは、int型ではなく、C++側で型を定義されたクラスのオブジェクト(の参照)を返す関数を、C#側から呼び出し、それをどうやってC#で受け取るかを教えていただきたいのです。 具体的には以下のように実装してみました。 [C++側のヘッダファイル] #ifdef CPPDLL_EXPORTS #define CPPDLL_API __declspec(dllexport) #else #define CPPDLL_API __declspec(dllimport) #endif class CPPDLL_API CCppDll { public: int data; CCppDll(void); }; #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ CPPDLL_API CCppDll& fnCppDll(); // C#が参照渡しということで、参照を返すようにした。 #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ [C++側のソースファイル] CPPDLL_API CCppDll& fnCppDll() { CCppDll* a = new CCppDll(); return *a; } CCppDll::CCppDll() : data(11) // メンバーは 11 で初期化 { } [C#側] using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApp1 { // ビルドエラーが起きるないように、とりあえず、C++と同じ(ような)クラスを定義 public class CCppDll { public int data; } public partial class Form1 : Form { [DllImport("CppDll.dll")] public static extern CCppDll fnCppDll(); public Form1() { InitializeComponent(); } private void buttonGo_Click(object sender, EventArgs e) { int n; CCppDll cls = fnCppDll(); // ※ n = cls.data; MessageBox.Show(n.ToString()); } private void buttonCancel_Click(object sender, EventArgs e) { Close(); } } } 実装しながらも、「これじゃあ、ダメだろうな。いかにもダメだな」と思った通り、上の※の部分で以下の例外が発生しました。 ------- 例外(ここから) ------- マネージド デバッグ アシスタント 'FatalExecutionEngineError' : 'ランタイムの重大なエラーが発生しました。エラーのアドレスは 0xcc9ff5a2、スレッド 0x36c8 です。エラー コードは 0xc0000005 です。これは CLR のバグであるか、またはユーザー コードのアンセーフまたは確認不可能な部分にバグがある可能性があります。このバグの一般的な原因には、スタックが壊れる可能性のある COM-interop または PInvoke のユーザー マーシャリング エラーが含まれています。' ------- 例外(ここまで) ------- 明らかに基本的なことが分かっていないことから起因するエラーと思われますが、具体的にどう実装すれば、正常に動きますか。(メッセージボックスで "11" を表示) よろしくお願いします。

  • C#からC++のDLLを使いたい時

    C#からC++(unmanaged)のDLLを使いたい時、 DLLをどのように参照すればよいのでしょうか。 [DllImport("名前.dll")] extern static double 関数名(); という指定は分かるのですが、 それだけじゃもちろん、 「DLL (名前.dll) を読み込めません。」 ってなりますよね・・・。

  • C#でWin32 MFC DLLが呼び出せない

    C#で以下のエラーが発生し、非常に困ってます。 色々とサイトを見たのですが、DLLが本当にないのでは?という意見が多かったです。 しかし、私の方はDLLファイルはbin->debugフォルダ , obj->debugフォルダ、System32に置いてます。 問題が分かる方、是非教えてください! using System.Runtime.InteropServices; namespace WindowsFormsApplication { public partial class Form1 : Form { [DllImport("Win32DLL_TEST.dll")] private extern static int func(int x, int y); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { int n = func3(5, 7);//ここでエラー! } } } エラー内容 'System.DllNotFoundException' のハンドルされていない例外が WindowsFormsApplication.exe で発生しました。 追加情報: DLL 'Win32DLL_TEST.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) 備考 DLLは自作のWin32 DLL です。 extern "C"{ __declspec(dllexport) int __cdecl func(int x, int y) } と宣言し、VC++のMFC dialog上では呼び出しを成功しています。

  • C#でのUNZIP32.DLLの利用方法が・・・

    「C#」で圧縮ファイルの中身を確認するためUNZIP32.DLLを利用しようと思うのですが、上手くいきません。 ためしに、UNZIP32.DLLのバージョン情報を獲得しようとしたのですが、以下のエラーが発生します。 'System.NuLLReferenceException'のハンドルされていない例外がWindowsApplication.exeで発生しました。 追加情報:オブジェクト参照がオブジェクトインスタンスに設定されていません。 ------------------------------------------- ソース ------------------------------------------- using System.Runtime.InteropServices; (略) [DllImport(@"D:\WINNT\system32\UNZIP32.DLL", EntryPoint="UnZipGetVersion")] public static extern string MyUnZipGetVersion(); (略) private void button1_Click(object sender, System.EventArgs e) { //MyMessageBox1(0,"by ANSI","Hello!",0); this.textBox1.Text = MyUnZipGetVersion(); } ご協力お願いします。(V^-°)

  • C#からDLLを呼びたいのですが・・・

    C#のASP.NET WebアプリケーションのDLLをC#のWindowsFormのexeで呼び出そうとしています。 すると 'System.EntryPointNotFoundException' のハンドルされていない例外が FTPApi.exe で発生しました。 追加情報 : DLL SampleApi.dll の GetURL というエントリ ポイントが見つかりません。 というエラーメッセージが表示されてしまいます。 クラス上部で [System.Runtime.InteropServices.DllImport("SampleApi.dll", EntryPoint="GetURL")] public static extern string GetURL(); と宣言した後、呼び出したい場所で、 strUrlPath = GetURL(); と呼んでいます。 よろしくお願いします。

  • C# パラメータが消える

    以下の様に 共通変数クラスSystemStartDEC を作成し、変数セットまではできてますが Login_Loadでは変数がクリアされています。 なぜでしょうか? public Login() { InitializeComponent(); Login_Load(); this.BtnCancel.Click += new System.EventHandler(this.BtnCancel_Click); this.BtnLogin.Click += new System.EventHandler(this.BtnLogin_Click); } private void Login_Load() { string[] strParam; //iniファイル読込 if (InspecTool004_02.GetIni(this.lVerComVal) == false) { clsEnc.DeleteFile(strSettingIniName); MessageBox.Show("INIファイルの読み込みに失敗しました。" + "/r/n" + "終了します。"); return; } } public class InspecTool004_02 { class IniFileHandler { [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName); [DllImport("KERNEL32.DLL", EntryPoint="GetPrivateProfileStringA")] public static extern uint GetPrivateProfileStringByByteArray(string lpAppName, string lpKeyName, string lpDefault, byte [] lpReturnedString, uint nSize, string lpFileName); [DllImport("KERNEL32.DLL")] public static extern uint GetPrivateProfileInt( string lpAppName, string lpKeyName, int nDefault, string lpFileName ); [DllImport("KERNEL32.DLL")] public static extern uint WritePrivateProfileString( string lpAppName, string lpKeyName, string lpString, string lpFileName); [DllImport("winmm.dll")] public static extern uint timeGetTime(); } //INIファイル読み込み public static Boolean GetIni(SystemStartDEC.strCom lVerComVal ) { StringBuilder sb_1 = new StringBuilder(1024); string strIniName ; string strBuffer ; Boolean bRtn ; strIniName = ".\\" + SystemStartDEC.strCom.SettingIniName; //DB Section IniFileHandler.GetPrivateProfileString("DB", "ConStr", "default", sb_1, sb_1.Capacity, strIniName); if( sb_1.ToString() == "default" ) { MessageBox.Show("SettingINIファイルDBセクションのConStrが読めません。"); return false; } lVerComVal.IniParam.DBStr = sb_1.ToString(); } public class SystemStartDEC { ////// <summary> ////// 全体共通 ////// </summary> ////// <remarks></remarks> public struct strCom { public strIniParam IniParam; public strUserInfo UserInfo ; public strDispInfo DispInfo ; public strMailInfo MailInfo ; } }

  • C#でのWNetAddConnection3の使い方を教えてください

    現在、C#(VisualStudio2005)で共有フォルダの認証を行い、 そのフォルダ内のファイルを読み込む処理を行ないたいと考えています。 ■動作------------------------------------------------------ 1.ボタン押下によってフォルダ(\\aaa)をユーザ(user)、パスワード(pass)で認証を行なう 2.ファイル(bbb.txt)の内容をメッセージボックスに出力する 3.認証を切る ■現在の実装状況-------------------------------------------- private void btnGetShareFileData_Click(object sender, EventArgs e) { NETRESOURCE netresource = new NETRESOURCE(); netresource.dwType = 1; netresource.lpLocalName = null; netresource.lpRemoteName = "\\\\aaa"; netresource.lpProvider = null; try { int returnNo1 = WNetAddConnection3(IntPtr.Zero, ref netresource, "user", "pass", 0); System.IO.StreamReader streamReader = new System.IO.StreamReader("\\\\aaa\\bbb.txt", System.Text.Encoding.GetEncoding(932)); MessageBox.Show(streamReader.ReadToEnd()); int returnNo2 = WNetCancelConnection2("\\\\aaa", "0", true); } catch (Exception ex) { MessageBox.Show(ex.Message); } } [StructLayout(LayoutKind.Sequential)] public struct NETRESOURCE { public int dwType; public string lpLocalName; public string lpRemoteName; public string lpProvider; } [DllImport("mpr.dll")] private static extern int WNetAddConnection3( System.IntPtr hWndOwner, ref NETRESOURCE lpNetResource, string lpPassword, string lpUserName, int dwFlags ); [DllImport("mpr.dll")] private static extern int WNetCancelConnection2( string lpName, string dwFlags, bool fForce ); [DllImport("mpr.dll")] private static extern int WNetAddConnection2( ref NETRESOURCE lpNetResource, string lpPassword, string lpUsername, int dwFlags ); ■結果------------------------------------------------------ WNetAddConnection3の戻り値が「487」で System.IO.StreamReader streamReaderを実行されると 「ログオン失敗:ユーザ名を認識できないかまたはパスワードが間違っています。」 とエラーになってします。 WNetAddConnection3でのログオン自体がうまくできていないのでしょうですが、 どうすればよいのかがわかりません。 (ちなみにWNetAddConnection2でやってみても同様です) どなたか教えていただけないでしょうか? いろいろなページは参考にさせていただいているのですが、 知識が足らず読み解くことができないので、 できればサンプルコード等を教えていただけると助かります。 よろしくお願いいたします。

  • C# 他のアプリケーションから複数行取得

    C#で外部のアプリケーションのリッチテキストコントロールの複数行の文字列を取得したいです。 自分は下のコードを書いたのですが、これだと1行しか取得できませんでした。 どこが悪いでしょうか。 ここでは対象のアプリケーションをA、リッチテキストのコントロールをRichEditとします。 button1をクリックしたら、textbox1にRichEditの内容が表示されるようなものを作ろうとしています。 //ここから [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, int wParam, StringBuilder lParam); private const int WM_GETTEXT = 0x000D; private void button1_Click(object sender, EventArgs e) { IntPtr hWnd = FindWindow("A", ""); if (hWnd != null) { IntPtr hWndChild = FindWindowEx(hWnd, IntPtr.Zero, "RichEdit", ""); StringBuilder strBuilder = new StringBuilder(); SendMessage(hWndChild, WM_GETTEXT, strBuilder.Capacity, strBuilder); StringReader strReader = new StringReader(strBuilder.ToString()); string stResult = string.Empty; while (strReader.Peek() >= 0) { string stBuffer = strReader.ReadLine(); stResult += stBuffer + System.Environment.NewLine; } strReader.Close(); textbox1.Text = stResult; } }

  • 特定座標のRGB値取得について

    kimarioと申します。 実行中の、あるアプリケーションの任意座標位置のRGB値を取得し、その結果を メッセージボックスにて表示させたいと考えております。 しかし下記のプログラムを実行すると、どの座標位置でもすべて(-1)で返ってき てしまいます。 getDCの戻り値が(0)ではないことを確認しているので、デバイスコンテキストの ハンドルは取得できているものと思われます。 API初心者です。よろしくお願いいたします。 補足) アプリケーションのウィンドウタイトルが「XXYYZZ」 色を特定したい座標を(60, 60)としています。 ############################################################################ public partial class Form1 : Form { [DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr hWnd); [DllImport( "user32.dll" )] static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC ); [DllImport( "gdi32.dll" )] static extern int GetPixel( IntPtr hDC, int x, int y ); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { foreach (Process p in Process.GetProcesses()) { if (p.MainWindowHandle != IntPtr.Zero) { if (p.MainWindowTitle == "XXYYZZ") { IntPtr dc = GetDC(p.MainWindowHandle); MessageBox.Show(GetPixel(dc, 60, 60).ToString()); } } } } }

専門家に質問してみよう