• 締切済み

読み込むdllが名前違いでたくさんある場合について

同じ引数、戻り値のdllが名前違いで100個あります。 これらをテストするツールを作成しています。 [DllImport("user32.dll")] のdllの部分を可変にすることは可能なのでしょうか?

みんなの回答

回答No.1

記法と内容の都合から, ・C# 2.0以上 ・.NET Framework 2.0以上または.NET Compact Framework 2.0以上 を前提にします。 まず,属性の引数を実行時に変更する事はできないです。 そのため,DllImportAttributeでなんとかする,という方向性で解決する事は出来ません。 ただ,幸い引数と戻り値が同じ (呼び出し規約も同じ?) なので,Win32 APIとの組み合わせで処理できます。 1. LoadLibrary API,GetProcAddress API,FreeLibrary APIをDllImport属性付きで宣言する。 MSDN: LoadLibrary Function (Windows) http://msdn.microsoft.com/en-us/library/ms684175.aspx MSDN: GetProcAddress Function (Windows) http://msdn.microsoft.com/en-us/library/ms683212.aspx MSDN: FreeLibrary Function (Windows) http://msdn.microsoft.com/en-us/library/ms683152.aspx 2. メソッドの型のデリゲートを用意する 3. LoadLibraryでDLLを読み込む 4. GetProcAddressで対象となる関数へのポインタを取得する 5. Marshal.GetDelegateForFunctionPointerで関数ポインタをデリゲートに変換する MSDN: Marshal.GetDelegateForFunctionPointer メソッド (System.Runtime.InteropServices) http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer.aspx 6. デリゲートを呼び出す 7. FreeLibraryでDLLを解放する

taku_pon
質問者

お礼

それぞれの項目で出てくる単語が未知のものすぎて 何を書いたらいいのかさっぱりわかりません。 調べたら教えて頂いた内容が出てくるので できそうな気配はします。 勉強してみます。

taku_pon
質問者

補足

ありがとうございます。 開発環境を書き忘れていました。 呼び元はC#2008で呼ばれるのはC(VC6.0でコンパイル)の プログラムです。