次に関する規則を呼び出す最初の3つの汎用クラスのDLL関数を導入する前に。
参考:https://www.cnblogs.com/yejianyong/p/7506465.html
我々は、デフォルトの呼び出し規約の関数を使用するVSのWindows APIとデフォルトの呼び出し規約は__stdcallで、__cdelです。あなたがインターフェイスと全会一致で合意したインタフェース定義を使用するときは、DLLインターフェイスを使用するときに私たちを呼び出して、必ず呼び出し規約を作ります。別の呼び出し規約なので、さまざまな方法は、メモリ解放機能をスタックに。
その後、我々は次のextern C、参照の役割を理解しhttps://www.cnblogs.com/carsonzhu/p/5272271.htmlを。
我々はC言語のライブラリ関数を記述するために使用されるC ++プログラム開発、開発プロセスを使用している場合、我々は、コードのこの部分は、C言語の構文のコンパイラとリンカを使用して、コンパイラに伝えるために、変更するにextern Cを使用する必要があります。
例えば:
#ifdefの__cplusplus
extern "C" {
#endifの
#include "legacy_C_header.h"
#ifdefの__cplusplus
}
#endifの
これは、マクロは、「__cplusplus」に定義されますので、それは、あなたがあなたのC ++コードにCヘッダファイルを使用することができることです。
ここでは、作成し、C ++のDLLを使用することを学ぶために始めます
C#プロジェクトにC ++プロジェクトを使用するか作成したDLL C ++が使用することもできます。
エクスポートする、記録機能をテーブルにエクスポートしているC ++は、DLL内の関数をエクスポートし、外部プログラムは、これらの機能は、(主機能と同様)DLLエントリポイントであることを、これらの機能が利用可能で呼び出します。テーブルのエクスポート機能では、彼らは、プライベート機能のための外部プログラムをDLLを呼び出すことはできませんではありません。
C ++ C ++プロジェクトコールエクスポートされた関数または派生クラス
導出関数参照のいくつかの方法https://www.cnblogs.com/findumars/p/8660427.html
関数宣言で、直接使用__declspec(DLLEXPORT)関数宣言
直接輸出を指定するには、DEFファイルを使用して、または機能
エクスポート関数ライブラリを使用する場合、我々は直接VS構成で、図書館の目録とlibファイル名を対応する動的ライブラリを指定することができるだけでなく、C / C ++ルーチンは、ディレクトリ、ディレクトリ指定されたヘッダファイルが含まれています。
#pragmaコメントはコード内で直接使用することができる、あなたは、特定の構文を参照することができますhttps://blog.csdn.net/wfq_1985/article/details/7456591
次のように使用します。
#pragmaコメント(libに、 ".. \\ CplusplusDll \\デバッグ\\ CplusplusDll.lib")
あなたは、ヘッダーのみを使用する関数の型を知っているかわからないときは、以下の機能を使用することができます。
typedef int型(* FUNC)(int型、int型);
HINSTANCE hInstanceは= LoadLibraryの(L ".. \\ CplusplusDll \\デバッグ\\ CplusplusDll.dll")。
LPCSTRのPC = "?GetMax @@ YAHHHする@ Z";
FUNC getmax =(FUNC)のGetProcAddress(hInstanceは、PC)。
INT最大= getmax(a、b)は、
マイクロソフトVSはxxx.dllがあなたの関数名を見ることができ、そして、あなたの一貫したGetMaxが慣例と機能の定義を呼び出すことを確認しなければなりませんDUMPBINエクスポートしを提供します。本明細書で使用する場合、規則はFUNCデフォルト値は、一般的に__cdelで使用され、場所を定義しGetMax機能が__cdelです。声明は__stdcall表示する必要がある場合は、{のtypedef int型(__ stdcallのの* funcを)(int型、int型);}
注、クラスの呼び出しのメンバ関数を使用して、直接、この方法はお勧めしません。
同じ関数を呼び出すと、エクスポートしたときにC ++派生クラス、C ++プロジェクトでは、動的に外部のLoadLibrary関数を使用してロードされていないことに加えて、VS構成と#progma前のコンパイラディレクティブを使用することができます。
#include "../CplusplusDll/CMath.h"
#pragmaコメント(libに、 ".. \\ CplusplusDll \\デバッグ\\ CplusplusDll.lib")
CMathのM;
INT和= m.add(5、6、7)。
C#プロジェクトの場合は、どのようにそれをエクスポートするには、C ++の関数を呼び出すには?System.Runtime.InteropServices名前空間で定義されたDLLIMPORT属性を使用します。参照https://www.cnblogs.com/xingboy/p/11158487.htmlを以下を使用して、
[DLLIMPORT(@ "CplusplusDll.dll"、CallingConvention = CallingConvention.Cdecl、エントリーポイント= "?GetMax @@ YAHHH @ Z")]
公共のextern int型の静的getMax(int型、int型のB)。
INT A = getMax(2、3)。
アンマネージドC ++クラスの場合は、C#が直接使用されるが、C#を使用して、管理対象のC ++コードの両方をサポートしていません。だから、アンマネージドC ++クラスは、梱包をホストすることによって導出することができ、ホストされている必要があり、データ型マネージドC ++のクラス、詳細はリンクをたどることができます。https://blog.csdn.net/weixin_34167819/article/details/ 91974250