外部から利用させたいC++の関数には、以下の記述を追加して宣言します。Writing Unmanaged Functions for Microsoft .NET Compact Framework-based Applications | MSDN
extern "C" __declspec( dllexport ) int FunctionName();
extern "C"
… コンパイラにC言語の関数として認識させます。これにより関数名で呼び出せるようになります。リンケージの仕様 | MSDN__declspec( dllexport )
… 外部から参照できるようにします。これを実際に使用するときには次のように#ifと#defineで定義しておくと、状況によってこの記述を削除できます。
#if defined(KEYWORD) #define DllExport extern "C" __declspec( dllexport ) #else #define DllExport #endif
DllExport int FunctionName();
呼び出したい関数に対して、DllImport属性を指定して宣言します。
class ClassName
{
[ System.Runtime.InteropServices.DllImport( "sample.dll" ) ]
static extern int FunctionName();
void Func()
{
// 関数の呼び出し
FunctionName();
}
}
DLL内の関数名は、dumpbinで調べられます。コマンドラインから、
>dumpbin.exe /EXPORTS DLLファイル名
のように実行することで、エクスポートされた関数名を確認できます。
nameの項目に関数名が表示され、下記の例では「FunctionName」がそれに該当します。
>dumpbin.exe /exports sample.dll Microsoft (R) COFF/PE Dumper Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file sample.dll File Type: DLL Section contains the following exports for sample.dll 00000000 characteristics 49A74D91 time date stamp Fri Feb 27 01:18:57 2009 0.00 version 1 ordinal base 1 number of functions 1 number of names ordinal hint RVA name 1 0 00001034 FunctionName Summary 1000 .data 1000 .pdata 1000 .rdata 1000 .reloc 1000 .text
Visual Studio 2008では実行時にmspdb80.dllが見つからないとのエラーとなるので、このファイルへのパス/Microsoft Visual Studio 9.0/Common7/IDEを設定すれば実行できます。
しかしこの方法では、コンパイル時に「C1902 : プログラム データベース マネージャが一致していません。セットアップが正しく行われているか確認してください。」とのエラーとなることがあります。そのときはdumpbin.exeとlink.exeへのパス/Microsoft Visual Studio 9.0/VC/binを設定します。
Windows Mobileの場合DLLが実行ファイルのフォルダにないと参照できないため、ターゲットのデバイスと出力ファイルのフォルダを一致させます。
C++のプロジェクトのプロパティ
C#のプロジェクトのプロパティ