C#DllImportを使用して管理されていないコードを呼び出す方法

1893 ワード

GetShortPathNameのメソッド署名を見つけ、
DWORD GetShortPathName(LPCTSTR tpszLongPath,TPTSTR lpszShortPath,DWORD cchBuffer);
非管理データ型と管理データ型の対応関係:
LPCTSTR         String
LPTSTR           StringBuilder
DWORD          int
DllImportのインポートルール:
1、方法名はWin APIと全く同じです.C#で呼び出されたときにまったく異なるメソッド名が表示される場合は、別名で表示されるEntryPointプロパティを導入する必要があります.
2、関数はDllImportクラス修飾子のほか、public static externタイプを宣言する必要があります.
3、関数の戻り値とパラメータは呼び出したAPIと全く同じでなければならない.
4、System.Runtime.InteropServicesネーミングスペースを導入する必要があります.
コード:
 
  
using System.Runtime.InteropServices;

public class Test

        {

            [DllImport("kernel32.dll",CharSet=CharSet.Auto,EntryPoint="GetShort")]

public static extern int GetShortPathName(

                [MarshalAs(UnmanagedType.LPTStr)] String path,

                [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,

int shortPathLength);

        }


コード呼び出しでkernel 32.dllのパスが書かれていないのは、DllImportが次の3つの順序でDllを検索するからです.
1、exeが存在するディレクトリ;2、System 32目次;3、環境変数ディレクトリ.
MarshalAsは、各データ型にデフォルトの封入動作があるため、管理コードと非管理コードの間でデータをどのように封入するかを示す属性であり、パラメータ、フィールド、および戻り値に使用できます.ほとんどの場合、この属性はUnmanagedType列挙タイプだけでほとんどの非管理データ型を満たすことができます.デフォルトでは文字がBStrとしてDllに入力されるなど、MarshalAsを使用して文字列をLPTStr、LPWstr、LPStrなどに指定できます.
DllImportオプション属性の説明
EntryPoint             メソッドに異なる名前を使用し、別名を使用できます.
CharSet                  関数呼び出しUnicodeかAnsiか
ExactSpelling        Falseは、コンパイラ自身がUnicodeまたはAnsiを使用することを選択することを示す
CallingConvetnion             そのパラメータはエントリポイント呼び出しの規則を示す.デフォルトがCallingConvention.WinAPIであることを指定しない
PreserveSig                    メソッド署名が保持されるべきか、または変換されるべきかを示し、変換されるとHRESULT戻り値とその戻り値を有するretvalという追加の出力パラメータの署名に変換され、デフォルトはtrueである.
SetLastError                   前回のエラーを保持するかどうかを指定します.デフォルトはfalseです.