C#から利用できるC++のDLLを作成する方法

コード内での記述

C++側 (DLL)

外部から利用させたいC++の関数には、以下の記述を追加して宣言します。Writing Unmanaged Functions for Microsoft .NET Compact Framework-based Applications | MSDN

extern "C" __declspec( dllexport ) int FunctionName();

これを実際に使用するときには次のように#ifと#defineで定義しておくと、状況によってこの記述を削除できます。

#if defined(KEYWORD)
  #define DllExport extern "C" __declspec( dllexport )
#else
  #define DllExport
#endif
DllExport int FunctionName();

C#側

呼び出したい関数に対して、DllImport属性を指定して宣言します。

class ClassName
{
    [ System.Runtime.InteropServices.DllImport( "sample.dll" ) ]
    static extern int FunctionName();

    void Func()
    {
        // 関数の呼び出し
        FunctionName();
    }
}

DLL内の関数名の確認方法

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#のプロジェクトのプロパティ