- 締切済み
読み込むdllが名前違いでたくさんある場合について
同じ引数、戻り値のdllが名前違いで100個あります。 これらをテストするツールを作成しています。 [DllImport("user32.dll")] のdllの部分を可変にすることは可能なのでしょうか?
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
記法と内容の都合から, ・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を解放する
お礼
それぞれの項目で出てくる単語が未知のものすぎて 何を書いたらいいのかさっぱりわかりません。 調べたら教えて頂いた内容が出てくるので できそうな気配はします。 勉強してみます。
補足
ありがとうございます。 開発環境を書き忘れていました。 呼び元はC#2008で呼ばれるのはC(VC6.0でコンパイル)の プログラムです。