c#呼び出しWin 32 API(C#DllImport用法)

2346 ワード


実際にC#を勉強しているとき、なぜすでに存在する機能(Windowsの機能、C++で作成された方法など)のためにコードを書き直すのか、C#が既存の機能を直接使用できる方法はありますか?答えは肯定的で、C#のDllImportで直接これらの機能を呼び出すことができます.DllImportの名前空間using System.Runtime.InteropServices;MSDNにおけるDllImportAttributeの解釈は、この属性をメソッドに適用することができる.DllImportAttributeプロパティは、管理されていないDLLからエクスポートされた関数を呼び出すために必要な情報を提供します.最低要件として、エントリポイントを含むDLLの名前を指定する必要があります.   
DllImportはSystemです.Runtime.InteropServicesネーミングスペースの次の属性クラスで、管理されていないDLLからエクスポートされた関数の必要な呼び出し情報を提供する機能を備えています.DllImportプロパティはメソッドに適用され、エントリポイントを含むdllの名前を最小限に抑える必要があります.
DllImportの定義は次のとおりです.
namespace System.Runtime.InteropServices   

 {    

     [AttributeUsage(AttributeTargets.Method)]   

     public class DllImportAttribute: System.Attribute  

     {     

         public DllImportAttribute(string dllName)

         {...}      

         

         public CallingConvention CallingConvention;   
        public CharSet CharSet;    
         public string EntryPoint;   
         public bool ExactSpelling;  
        public bool PreserveSig;   
         public bool SetLastError;   
         public string Value { get {...} }    

     }   

 }   

説明:1、DllImportはメソッド宣言にのみ配置できます.2、DllImportには単一の位置決めパラメータがあります.インポートされたメソッドのdll名を含むdllNameパラメータを指定します.3、DllImportには、a、CallingConventionパラメータがエントリポイントの呼び出し規則を示す5つの名前付きパラメータがあります.CallingConventionが指定されていない場合は、デフォルトのCallingConventionを使用します.Winapi.b、CharSetパラメータは、エントリポイントで使用される文字セットを示す.CharSetが指定されていない場合は、デフォルト値CharSetを使用します.Auto.c、EntryPointパラメータはdllのエントリポイントの名前を与えます.EntryPointが指定されていない場合は、メソッド自体の名前を使用します.d、ExactSpellingパラメータは、EntryPointが指示されたエントリポイントのスペルと完全に一致しなければならないかどうかを示す.ExactSpellingが指定されていない場合は、デフォルトfalseを使用します.e、PreserveSigパラメータは、方法の署名が保持されるべきか、または変換されるべきかを示す.署名が変換されると、HRESULT戻り値とretvalという追加の出力パラメータとを有する署名に変換される.PreserveSigが指定されていない場合は、デフォルトのtrueを使用します.f、SetLastErrorパラメータは、方法がWin 32「前のエラー」を保持するかどうかを示す.SetLastErrorが指定されていない場合は、デフォルトfalseを使用します.4、使い捨て属性クラスです.5、また、DllImport属性で修飾する方法にはextern修飾子が必要です.
使用例:
        //            
        [DllImport("USER32.dll")]
        public static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
        //      
        [DllImport("USER32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

転載先:https://www.cnblogs.com/fornet/archive/2013/02/17/2976174.html