こんにちはC#1ヶ月目の初心者です
dllの参照方法について質問いたします。
自分で作成したdllをdllimportを使用して呼び出したいのですか
作成し実行したところ
(*.dllはwindows\system32\の下に配置しました。)
DLL *.dll の dataread というエントリ ポイントが見つかりません
というエラーが出てしまいます。
自分で作成したdllをdllimportを使用して呼び出しすことは可能なのでしょうか?
やり方が悪いのでしょうか?
なにぶん勉強不足でわからない状態です。
ご存知の方いらっしゃいましたらよろしくお願いいたします。
os windows XP
言語 vs.net 2003
>こんにちはC#1ヶ月目の初心者です
私もまだ半年程度です。
ですので間違ったことを書いている可能性もあります。
その時はごめんなさい。
>自分で作成したdllをdllimportを使用して呼び出しすことは可能なのでしょうか?
可能です。
>DLL ****.dll の dataread というエントリ ポイントが見つかりません
>というエラーが出てしまいます。
datareadをdllimportしている箇所はどうなっていますか?
DLL側の宣言はどうなっていますか?
dllimportについては
「iniファイルの参照方法について」
http://rararahp.cool.ne.jp/cgi-bin/lng/csharp/csharplng.cgi?
print+200312/03120002.txt
が参考になるかと思います。
t2さん返信ありがとうございます
datareadをdllimportしている箇所はどうなっていますか?
ということですが
mainのファイル側で
[DllImport(**.dll)]
public static void dataread
(string setion, string userid, string passwd, string sname, int knet);
を宣言して
Form1_Loadで
wsetion string;
wuserid string;
wpasswd string;
wsname string;
int wknet;
public static void dataread
(wsetion, wuserid, wpasswd, wsname, wknet);
を呼び出そうと思っています。
DLL側の宣言はどうなっていますか?
ということですが**.dll側の設定は
public calss init の下に
[DllImport(Kernel32.dll)]
public static extern int GetPrivateProfileString
(
string lpAppName, // セクション名
string lpKeyName, // キー名
string lpDefault, // 既定の文字列
StringBuilder lpReturnedString, // 情報が格納されるバッファ
int nSize, // 情報バッファのサイズ
string lpFileName // .ini ファイルの名前
);
を宣言して
その次の行に
public static void dataread(string setion, string userid, string passwd,
string sname, int knet)
{
int ichk;
StringBuilder temp = new StringBuilder(255);
ichk=GetPrivateProfileString(setion,USER, ",temp,255, @c:\temp.ini);
userid = temp.ToString();
}
というような感じでやりたいです。
よろしくお願いいたします。
>DLL ****.dll の dataread というエントリ ポイントが見つかりません
>というエラーが出てしまいます。
エラーメッセージのとおり、dll 内に dataread という名前の関数が見つからないので
しょう。
VC 付属の dumpbin ツールで、dll 関数がどんな名前でエクスポートされているか確認
してみてください。
関数名が
hoe@4
などのように @<数字> を伴っているようなら、dll のプロジェクトに .def ファイルを
追加して、dll 関数のエクスポート名を制御してください。
>というような感じでやりたいです。
この .dll ってちゃんとビルドできていますか?
>その次の行に
>public static void dataread(string setion, string userid, string passwd,
>string sname, int knet)
とのことですすが、C/C++ 言語の基本型に string は存在しません。
この string はどこから持ってきたものでしょう?
DllImport では C++ クラスを受け渡すことは出来ないことに注意してください。
渋木宏明(ひどり)さん返信ありがとうございます。
>VC 付属の dumpbin ツールで、dll 関数がどんな名前でエクスポートされているか確認
>してみてください。
>関数名が
>hoe@4
>などのように @<数字> を伴っているようなら、dll のプロジェクトに .def ファイル
>を追加して、dll 関数のエクスポート名を制御してください。
とかいてありますが、c#初心者なので詳しく教えてください。
VC 付属の dumpbin ツールとかいてありますが、
C#.NETでもできるということですか?
それともC++をインストールしてdumpbin ツールを使わないといけないということでしょ
うか?
試しにコマンドプロンプトでやってみましたができませんでした。
C#.NETでもできるのであればどこでどのようにしたらよろしいでしょうか?
>この .dll ってちゃんとビルドできていますか?
ですがビルドをかけたときには正常終了できています。
>DllImport では C++ クラスを受け渡すことは出来ないことに注意してください
とかいてありますがDllImportでは引数を使えないということでしょうか?
なにぶん勉強不足ですいません もう一度おしえてください。
開発環境
Visual c#.net 2003
>Form1_Loadで
>wsetion string;
>wuserid string;
>wpasswd string;
>wsname string;
>int wknet;
Form1_Loadって自作の関数?(VBじゃないよね?)
>DLL側の宣言はどうなっていますか?
>ということですが*****.dll側の設定は
>public calss init の下に
>[DllImport(Kernel32.dll)]
>public static extern int GetPrivateProfileString
<省略>
>それともC++をインストールしてdumpbin ツールを使わないといけないということでしょ
>うか?
>試しにコマンドプロンプトでやってみましたができませんでした。
>C#.NETでもできるのであればどこでどのようにしたらよろしいでしょうか?
もしかしてDLLはC#かつマネージで作ってます?
>>DllImport では C++ クラスを受け渡すことは出来ないことに注意してください
>とかいてありますがDllImportでは引数を使えないということでしょうか?
違います。
C++「クラス」を渡せないだけです。
>とかいてありますが、c#初心者なので詳しく教えてください。
dumpbin ツールについて、ヘルプで調べてみましたか?
あと、.def ファイルについても自分で調べてみてください。
>C#.NETでもできるということですか?
本来は VC++ に付属のツールなので、Visual C#.NET 単体パッケージには付属していな
いかもしれません。
ですが、
>それともC++をインストールしてdumpbin ツールを使わないといけないということでし
ょ
うか?
作業環境が
>言語 vs.net 2003
とのことなので、標準構成でインストールしているなら、VC++ も C# も使える状態です
よね?
VC++ がインストールされていない状態で、どうやって dll をビルドしているのです
か?
>試しにコマンドプロンプトでやってみましたができませんでした。
Visual Studio .NET をインストールすると、スターとメニューに登録される「Visual
Studio .NET 2003 コマンド プロンプト」でも駄目ですか?
>>DllImport では C++ クラスを受け渡すことは出来ないことに注意してください
>とかいてありますがDllImportでは引数を使えないということでしょうか?
DllImport で呼び出す関数の「引数」に、C++ のクラスを含めることはできないという
ことです。
C/C++ で記述された関数なら何でも呼び出しが出来るわけではなく、char や int,
double などの単純型とそのポインタ、C# の struct で表現可能な構造体を引数に持つ
関数だけが、DllImport によって C# などの .NET 系言語から呼び出せます。
t2さん
渋木宏明(ひどり)さん
返信ありがとうございます。
もう一度調べなおしてみます。
ありがとうございました