C++のDLLをC#から利用する方法

用語

P/Invoke (Platform Invocation Service)
アンマネージドDLL内の関数や構造体、コールバックへのアクセスを可能とする.NETの機能
マーシャラ (Marshaler)
COMとWindows APIが使用する型についての情報を持ち、CLRの型の既定変換を自動的に行う.NETの機能
CLS (Common Language Specification)
共通言語仕様。多くのアプリケーションで必要とされる基本的な言語機能のセット

トラブル対処法

可能ならばデバッグ ビルドしたDLLと、そのPDBファイルを用意します。

C++のコードをデバッグできない

C++のコードにステップインできないときは、C#のプロジェクトのプロパティの[デバッグ]にある、[アンマネージ コード デバッグを有効にする (Enable unmanaged code debugging)]または[ネイティブ コードのデバッグを有効にする (Enable native code debugging)]をチェックします。 [デバッガーを有効にする] - [デバッグ] ページ (プロジェクト デザイナー) | MSDN ネイティブ コードのデバッグ | MSDN

この[ネイティブ コードのデバッグを有効にする]をチェックしていないと、C++からのエラーでブレイクせずにアプリケーションが終了することがあります。

モジュールが見つからない

DLLを参照しているアプリケーションの実行時に、次のような例外が発生することがあります。

System.IO.FileNotFoundException はハンドルされませんでした。
Message: 型 'System.IO.FileNotFoundException' のハンドルされていない例外が mscorlib.dll で発生しました
追加情報:ファイルまたはアセンブリ '**.dll'、またはその依存関係の 1 つが読み込めませんでした。指定されたモジュールが見つかりません。

これは参照しているDLLがない、またはそのDLLが依存しているDLLが適切に配置されていない場合に発生します。これは問題のDLLをdumpbinで調べ、それを配置することで解決できます。

参考

参考書

Microsoft Learnから検索