2024年3月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29    
無料ブログはココログ

 

« プログラムの考察:関数の大きさ | トップページ | 注文した本 »

2009年11月19日 (木)

C#でDLLを動的に読み込みたい

和魂は、FireFoxのクッキーを読み込むときにSQLiteを使用する。
しかし、プロジェクトで参照設定を行って、リンクしているため、DLLが無かったりバージョンがリンク時のものと違ってしまうと、DLLのクラスを生成するときに落ちてしまう。
C言語(というよりVisual C++か?)では、LoadLibrary()を使えばDLLが無くても落ちることはない。(もちろんDLLが無いときのエラー処理をしているという前提があるけど)

C#にも同じような機能が無いものかと検索してみると、当たり前だけどあった。
GoldFishさんの「動的にアセンブリを呼び出す」はわかりやすいですね。

とりあえず、SQLiteのDLLを読み込んで、SQLiteConnectionクラスを生成できるか試してみた。(時間が無いのでメソッドを呼ぶまでは試していない)

  • Assembly.LoadFrom()とassembly.GetModule()の引数に文字列で"System.Data.SQLite.dll"を指定する
                    // アセンブリをロード
                    Assembly assembly = Assembly.LoadFrom( "System.Data.SQLite.dll");
                    // アセンブリ内のモジュールを取得
                    // 通常は、ファイル名と同じ
                    Module module = assembly.GetModule( "System.Data.SQLite.dll");
  • module.GetType()の引数に文字列で"System.Data.SQLite.SQLiteConnection"を指定する
                    // アセンブリ内のクラスを取得
                    // ネームスペースを含めた完全なクラス名で
                    // 指定する
                    System.Type type = module.GetType("System.Data.SQLite.SQLiteConnection");

以上、これで、type変数に値が入って、その次のObject form = Activator.CreateInstance(type);でオブジェクトが生成される。
次はメソッドを取ってMethodInfo::Invole()で実行すればよい。

SQLiteやMedia Playerを読み込もうとしているのだが、入れ忘れたファイルがあるようで、提供してあるExeのZipファイルでは起動しない。(と思う)
SQLiteとC#でSQLiteを使うラッパDLLを落としてきてビルドすれば使えるのだが・・・。
Visual C# 2008を誰もがダウンロードするわけでもないからなぁ。
近いうちに和魂を直そう。

« プログラムの考察:関数の大きさ | トップページ | 注文した本 »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: C#でDLLを動的に読み込みたい:

« プログラムの考察:関数の大きさ | トップページ | 注文した本 »