C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 【C#】DllImportで指定した関数が使えるかどうか


(過去ログ 23 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■10261 / inTopicNo.1)  【C#】DllImportで指定した関数が使えるかどうか
  
□投稿者/ まひろ (1回)-(2007/11/14(Wed) 21:50:46)

分類:[C#] 

VisualStudio 2005 C# Express Editionです。

あるDLLの関数をImportして使おうと思っていますが、
DllImportで指定したDLLがImportできているかどうかを
関数を呼ぶ前に確認したいと思っています。

どのような方法があるか教えてください。

引用返信 編集キー/
■10273 / inTopicNo.2)  Re[1]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ chamaro (4回)-(2007/11/14(Wed) 23:44:54)
> あるDLLの関数をImportして使おうと思っていますが、
> DllImportで指定したDLLがImportできているかどうかを
> 関数を呼ぶ前に確認したいと思っています。
関数を呼ぶ前に確認とは?
そのEXEが実行できればImportされているのではないでしょうか?
動的リンクしたいと言う事でしょうか?
引用返信 編集キー/
■10275 / inTopicNo.3)  Re[2]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ 渋木宏明(ひどり) (550回)-(2007/11/15(Thu) 00:47:54)
渋木宏明(ひどり) さんの Web サイト
>>DllImportで指定したDLLがImportできているかどうかを
>>関数を呼ぶ前に確認したいと思っています。

事前にチェックしたいのであれば、LoadLibrary(), GetProcAddress() API でも使うしかなさそーです。

事後でよければ、DLL 関数を呼び出した時に例外(名称忘れました。ヘルプ他で調べてください)が発生するので、それを catch して後処理する、とかです。

> そのEXEが実行できればImportされているのではないでしょうか?

いいえ。

DllImport は、対象の DLL 関数が初めて呼び出された時に動的に DLL のロードを行います。

DLL 関数を使用している exe が起動しただけでは、DllImport している DLL 関数が必ず呼び出せるという保証はありません。

引用返信 編集キー/
■10293 / inTopicNo.4)  Re[3]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ まひろ (2回)-(2007/11/15(Thu) 10:01:35)
chamaroさん、渋木宏明(ひどり)さん、レスありがとうございます。

> 事前にチェックしたいのであれば、LoadLibrary(), GetProcAddress() API でも
> 使うしかなさそーです。
>
> 事後でよければ、DLL 関数を呼び出した時に例外(名称忘れました。ヘルプ他で調べてください)
> が発生するので、それを catch して後処理する、とかです。

LoadLibrary(), GetProcAddress()を調べてみます。
ありがとうございました。

解決済み
引用返信 編集キー/
■10307 / inTopicNo.5)  Re[4]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ 渋木宏明(ひどり) (551回)-(2007/11/15(Thu) 12:26:25)
渋木宏明(ひどり) さんの Web サイト
> LoadLibrary(), GetProcAddress()を調べてみます。

でも特に問題はないと思いますが、さしつかえなければ

>>事後でよければ、DLL 関数を呼び出した時に例外(名称忘れました。ヘルプ他で調べてください)
>>が発生するので、それを catch して後処理する、とかです。

で駄目な理由を教えてもらえませんか?

例外が発生するということで、処理速度などに影響があるのが問題とか、そういうことでしょうか?

引用返信 編集キー/
■10310 / inTopicNo.6)  Re[5]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ まひろ (3回)-(2007/11/15(Thu) 13:30:06)
> >>事後でよければ、DLL 関数を呼び出した時に例外(名称忘れました。ヘルプ他で調べてください)
> >>が発生するので、それを catch して後処理する、とかです。
>
> で駄目な理由を教えてもらえませんか?

処理速度も要求されていますし、
DllImportしたい関数が多く、毎回例外をcatchするよりも
いいかなと考えているためです。

Dllがロードできるかどうかによって、
生成するインスタンスを変えようと思っています。

LoadLibraryで試したところ、うまくいきそうです。

interface IA
{
void DllFuncCall();
}

class A : IA
{
public void DllFuncCall()
{
}
}

class AImpl : IA
{
[DllImport("hoge.dll", ・・・)]
private static extern void DllFunc();

public void DllFuncCall()
{
DllFunc();
}
}

IA GetIA()
{
if (LoadLibrary("hoge.dll") != IntPtr.Zero)
return new AImpl;
else
return new A;
}

引用返信 編集キー/
■10311 / inTopicNo.7)  Re[6]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ 渋木宏明(ひどり) (552回)-(2007/11/15(Thu) 14:14:38)
渋木宏明(ひどり) さんの Web サイト
> 処理速度も要求されていますし、
> DllImportしたい関数が多く、毎回例外をcatchするよりも
> いいかなと考えているためです。

なるほど。であれば

> Dllがロードできるかどうかによって、
> 生成するインスタンスを変えようと思っています。

はうまい手ですね。

ファクトリパターンを使っているところも美しいと思います ;-)

引用返信 編集キー/
■10312 / inTopicNo.8)  Re[6]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ シャノン (222回)-(2007/11/15(Thu) 14:33:59)
No10310 (まひろ さん) に返信
> Dllがロードできるかどうかによって、
> 生成するインスタンスを変えようと思っています。

FreeLibrary を忘れずにね。
引用返信 編集キー/
■10313 / inTopicNo.9)  Re[7]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ 渋木宏明(ひどり) (553回)-(2007/11/15(Thu) 14:43:45)
渋木宏明(ひどり) さんの Web サイト
> FreeLibrary を忘れずにね。

DllImport した時点でプロセス終了まで DLL が解放されないので、省略しちゃってもいいかなとか (^^;

引用返信 編集キー/
■10315 / inTopicNo.10)  Re[8]: 【C#】DllImportで指定した関数が使えるかどうか
□投稿者/ まひろ (4回)-(2007/11/15(Thu) 15:11:01)
>> FreeLibrary を忘れずにね。

>DllImport した時点でプロセス終了まで DLL が解放されないので、省略しちゃってもいいかなとか (^^;

なるほど。
検討してみます。

ありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -