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を誰もがダウンロードするわけでもないからなぁ。
近いうちに和魂を直そう。
« プログラムの考察:関数の大きさ | トップページ | 注文した本 »
コメント