彼女の空き時間に、ノート覚えて!C ++動的ライブラリ(DLL)を呼び出す方法のC#についての録音。
ステップ:
:まず、のような、C ++クラスを作成
AddOperate.h
extern _declspec(のdllexport)int型の合計(int型、int型B)を。 クラスAddOperate { パブリック: }。
AddOperate.cpp
#include " AddOperate.h " の#include " のiostream " 使って 名前空間はstdを、 INT合計(int型、int型B) { 場合( - (INT)=!0 || B - (INT)B =!0 ){ COUT << " 请输入整数" << ENDL。 戻る - 1 。 } 戻り A + B。 }
2、DLLにコンパイルC ++コードは、DLL
構成設定をコンパイルする必要があります:
Aを:プロジェクト-属性タイプ---補償インデックス-一般的な構成タイプ--- ---ダイナミックライブラリ(.dllファイル)
B:プロジェクト - プロパティ - 構成プロパティ - C / C ++ --- --- ---高度なC ++コード(/ TP)にコンパイルされた思考
このイベントへのX64の注意、また、X64を使用して最高のC#を入れて呼び出します。
その後、プロジェクトをクリックして - 生成され、あなたがdllファイルが表示されます。
図3に示すように、一般的に以下のbin /デバッグ中に、ディレクトリエントリ入力にコピーC#のDLL。
C#コードで書かれた4は、DLLを呼び出します
[DLLIMPORT(" Calculate.dll "、CallingConvention = CallingConvention.Cdecl)] のextern 静的 int型の合計(INT A、INT B)。 公共の 静的な 無効メイン(文字列[] argsが){ しようと{ Console.WriteLineを(" 请输入NumberAを:" ); INT numberA = Convert.ToInt32(Console.ReadLine())。 Console.WriteLineを(" 请输入NumberB:" ); int型 numberB =Convert.ToInt32(Console.ReadLine())。 Console.WriteLineを($ " numberAである:{numberA}; numberBである:{numberB}は、合計である:{合計(numberA、numberB)} " ); } キャッチ(例外例){ Console.WriteLineを($ " EX:{EX} " ); } Console.ReadLine(); }
二つの主な行:
「和」の方法は、DLLのメソッド名と同じでなければならない、または見つけることができません。
そして、その結果を見て:
非常に恥ずかしい、ない「和」の方法を示唆し、我々は、操作上の問題を持っています。
長い時間のための調査は、C ++のDLLをコンパイルする方法を見つけるためにする場合、メソッド名はなく、安全のため、変更されます。
ソリューション:
C言語にC ++のコードを持っていこう!
このように、再度実行して、DLLが来るコンパイルします。
結果:
発生する可能性のあるV.その他の問題
:PInvokeの関数の呼び出しは、スタックの非対称性の原因となります
CallingConvention = CallingConvention.Cdecl:メソッドを定義します
B:未処理System.BadImageFormatException、間違ったフォーマットのプログラムをロードしようとしています。(HRESULTからの例外:0x8007000B)
だから、OK!。