シミュレーションを行うC++フレームワーク用のAPIを作成する必要があります。関数を使用して新しいクラスを作成__declspec(dllexport)
し、DLLにフレームワークを構築しました。これは正常に機能し、C#アプリケーション内でフレームワークを使用できます。しかし、C ++でAPIを作成するための別のまたはより良いアプローチはありますか?
2 に答える
C ++-APIを作成する場合は、DLL/共有ライブラリからクラスのセットをエクスポートするのが良い方法です。ただし、C ++で記述された多くのライブラリは、Cインターフェイスを提供することを決定します。これは、純粋なCインターフェイスの方が外国語にバインドするのがはるかに簡単だからです。外国語をC++にバインドするには、通常、SWIGなどのラッパージェネレーターが必要です。
C ++-APIには、C ++の名前マングリングのために、フレームワークとアプリケーションを構築するために同じコンパイラ/リンカーを使用する必要があるという問題もあります。
__declspec(dllexport)
クラスをエクスポートする必要があることをコンパイラに通知するメカニズムは、Microsoftコンパイラに固有であることに注意することが重要です。他のコンパイラで同じコードを使用できるように、プリプロセッサマクロに配置するのが一般的な方法です。
#ifdef _MSC_VER
# define MY_APP_API __declspec(dllexport)
#else
# define MY_APP_API
#endif
class MY_APP_API MyClass {}
クラスをエクスポートするソリューションには、いくつかの重大な欠点があります。名前のマングリングをサポートしていないため、他の言語でDLLを作成することはできません。さらに、VS以外のコンパイラを使用することはできません(同じ理由で)。さらに、 MSは保証していないため、別のバージョンのVSを使用できない場合があります。これは、コンパイラの異なるバージョンでマングリングメカニズムが同じままであることを保証するためです。
平坦化されたCスタイルのインターフェイスを使用することをお勧めします。
MyClass::Method(int i, float f);
としてエクスポート:
MyClass_MyMethod(MyClass * instance, int i, float f);
これをC#でラップして、クラスにすることができます。