DllImport


DllImport 属性の使用参照 属性のチュートリアル ここでは、DllImport 属性の基本的な使用方法を紹介します。最初に、DllImport を使ってマネージ アプリケーションからネイティブ コードを呼び出す利点を説明します。次に、マーシャリングと DllImport 属性に焦点を当てます。

マネージ アプリケーションからのアンマネージ コードの呼び出し DllImport 属性は、マネージ アプリケーションにおいて既存のアンマネージ コードを再利用するときに役立ちます。たとえば、マネージ アプリケーションからアンマネージ WIN32 API を呼び出す必要があるとします。

次のコード サンプルは、この一般的なシナリオを示した例で、User32.lib にある MessageBox? を呼び出しています。

#using <mscorlib.dll> using namespace System::Runtime::InteropServices?;  // for DllImportAttribute?

namespace SysWin32 {

  [DllImport("user32.dll", EntryPoint = "MessageBox", CharSet = Unicode)]
  int MessageBox(void* hWnd, wchar_t* lpText, wchar_t* lpCaption, 
                 unsigned int uType);

}

int main( ) {

  SysWin32::MessageBox( 0, L"Hello world!", L"Greetings", 0 );

} 最も重要な部分は、DllImport を含むコード行です。このコード行は、パラメータの値に基づいて、コンパイラに対して、User32.dll にある関数を宣言し、シグネチャに出現するすべての文字列 (パラメータや戻り値など) を Unicode 文字列として扱うように指定しています。EntryPoint? 引数がない場合、デフォルト値は関数の名前になります。また、CharSet? 引数で Unicode が指定されているため、共通言語ランタイムは、MessageBoxW (Unicode 規格の関数の場合は "W" を付加) という名前の関数を最初に検索します。ランタイムは、この関数を発見できないと、呼び出し規約に基づいて、MessageBox? とそれに対応する装飾名を検索します。サポートされている規約は __cdecl と __stdcall だけです。

ユーザー定義 DLL に含まれている関数を呼び出す場合は、次のように DLL 関数宣言の前に extern "C" を付ける必要があります。

 // The function declaration in SampleDLL.h file

extern "C" SAMPLEDLL_API int fnSampleDLL(void);