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);