C#におけるDllImportの使い方の紹介

4069 ワード

DllImportの説明


DllImportはSystemです.Runtime.InteropServicesネーミングスペースの下にある属性クラスであるため、ASP.NETでDllImportを使用する場合は、先に「using System.Runtime.InteropServices;」が必要です.この機能は、管理されていないDLLから導出された関数の呼び出しに必要な情報を提供することである.DllImportプロパティはメソッドに適用され、エントリポイントを含むdllの名前を最小限に抑える必要があります.

DllImportプロパティ定義

namespace System.Runtime.InteropServices
   {
    [AttributeUsage(AttributeTargets.Method)]
    public class DllImportAttribute: System.Attribute
    {
         public DllImportAttribute(string dllName){...}   //     dllName
         public CallingConvention CallingConvention;      //       
         public CharSet CharSet;                          //         
         public string EntryPoint;                        //     
         public bool ExactSpelling;                       //                 ,  false
         public bool PreserveSig;                         //              
         public bool SetLastError;                        //FindLastError           
         public string Value {get {...}}                            
    } 
  }  
説明:1、DllImportはメソッド宣言にのみ配置できます.2、DllImportには単一の位置決めパラメータがあります.インポートされたメソッドのdll名を含むdllNameパラメータを指定します.3、DllImportには5つの命名パラメータがあります.
  • CallingConventionパラメータは、エントリポイントの呼び出し規則を示す.CallingConventionが指定されていない場合は、デフォルトのCallingConventionを使用します.Winapi.
  • CharSetパラメータは、エントリポイントで使用される文字セットを指定します.CharSetが指定されていない場合は、デフォルト値CharSetを使用します.Auto.
  • EntryPointパラメータは、dllのエントリポイントの名前を与えます.EntryPointが指定されていない場合は、メソッド自体の名前を使用します.
  • ExactSpellingパラメータは、EntryPointが入力ポイントのスペルと完全に一致する必要があるかどうかを示します.ExactSpellingが指定されていない場合は、デフォルトfalseを使用します.
  • PreserveSigパラメータは、方法の署名が保持されるか、または変換されるかを示す.署名が変換されると、HRESULT戻り値とretvalという追加の出力パラメータとを有する署名に変換される.PreserveSigが指定されていない場合は、デフォルトのtrueを使用します.
  • SetLastErrorパラメータは、方法がWin 32「前のエラー」を保持しているかどうかを示します.SetLastErrorが指定されていない場合は、デフォルトfalseを使用します.
  • 4、使い捨て属性クラスです.5、DllImport属性で修飾する方法はextern修飾子を持たなければならない.DllImportの使用例(iniファイルを書き込むwin 32 api):DllImport(「kernel 32」)private static extern long WritePrivateProfileString(string section,string key,string val,string filePath);この方法でWinAPIを呼び出すデータ型対応:DWORD=intまたはuint,BOOL=bool,事前定義定数=enum,構造=struct.

    DllImportパスの問題


    DllImportでは、1、exeが存在するディレクトリ2、System 32ディレクトリ3、環境変数ディレクトリを順番に自動的に探しますので、参照したDLLをこの3つのディレクトリにコピーするだけでパスを書かなくてもいいです.Webの中の、同時にアプリケーションの中の後で発見して[DllImport(@"C:\OJ\Bin\Judge.dll")]でこのようにDLLの絶対的な経路を指定して正常にマウントすることができます.この問題はサードパーティ製の非管理DLLコンポーネントを使用するときに最もよく発生します.私のも同じようにこの時に発生した問題です.Asp.Net Teamの公式ソリューションは、まず、どのコンポーネントを参照しているのか、管理されているのか、管理されていないのかを確認する必要があります.管理が容易で、直接使用する必要がある場合は引用し、間接使用する必要がある場合はbinディレクトリにコピーする.管理されていない処理は面倒です.実際、binにコピーしても何の役にも立たない.CLRは一時ディレクトリにファイルをコピーし、そこでwebを実行し、CLRは管理ファイルだけをコピーするからだ.これは、管理されていないdllをbinの下に置いたのにモジュールをロードできないことを示しているからだ.具体的には、まず、C:DLLの場合、サーバ上で任意の場所を探してディレクトリを新規作成します.次に、環境変数でPath変数にこのディレクトリを追加します.最後に、すべての非管理ファイルをC:DLLにコピーするか、よりいっそDLLをsystem 32ディレクトリに配置します.自分で導入できるアプリケーションでは、このような未払いは解決策ではありませんが、仮想空間を使用している場合は、PATH変数を登録したり、自分のDLLをsystem 32ディレクトリにコピーしたりすることはできません.同時に、私たちのDllの物理的な経路を知っているとは限らない.DllImportでは、サーバではなく文字列定数しか使用できません.物理パスは、MapPath(@"~/Bin/Judge.dll")によって決定される.