web-dev-qa-db-ja.com

複数のプログラミング言語から呼び出せるDLLを作成するにはどうすればよいですか?

現在、プログラミングサイト(プログラムに含める必要があります)などの認証ライブラリを構築しています。

問題は、いくつかの言語が使用されており、c#、Java、python(すべて1つのdllに含まれる)などの一部の大きな言語で参照できる認証ライブラリを作成したいことです。

このようなことはc ++でもできると聞いたので、c ++でライブラリを作成しましたが、他の言語でそれを参照する方法がわかりません。

1
user335394

C++を使用するときに直面する問題は、DLLです。

  • シンボル名は マングル になるため、他の言語からは簡単に使用できません。
  • c ++オブジェクトモデルは、他の言語のオブジェクトのユーザビリティに制約を課します。たとえば、他の言語ではオブジェクトが使用されなくなったときにオブジェクトを破棄する方法がわからないため、コピーできないオブジェクトを返すC++関数の戻り値は、ほとんどの言語で使用できない場合があります。
  • c ++オブジェクトのレイアウトは実装に依存しており、C++メモリモデルではほとんど保証されないため、ほとんどの言語ではクラスメンバーに簡単にアクセスできません。

ただし、_extern "C"_関数を介してDLLインターフェイスを定義し、C互換データ型への交換を制限することで、この制限の多くを克服できます。

  • Javaの場合、 ネイティブDLLをロード し、JNIを使​​用して公開された関数を呼び出すことができます。あるいは、JNR/FFIまたは提案されている他のソリューション here を検討することもできます。
  • Pythonの場合、 ctypes の使用を検討できます。
  • C#(およびその他のマネージ言語)の場合、Robertのリンクを検討できます。
3
Christophe

DLL(たとえば、共有オブジェクトライブラリではなく)と指定した場合)、Windowsのみに関心があるようです。

この場合、基本的にいくつかの選択肢があります。最初の(そして通常は最も単純な)は、最も一般的な分母アプローチです。Windows自体とほぼ同じインターフェイスを使用します。名前の最小限のマングルと、Microsoftのstdcall呼び出し規約です。

他の明らかな選択は、COMオブジェクトを作成することです。かなりの数の言語の場合、COMオブジェクトは(とりわけ)COMオブジェクトがほぼ完全に自己記述的であるため、再利用がかなり簡単になります。つまり、他の言語がCOMオブジェクトを使用するために必要な情報を含めることができます。

オブジェクト指向言語からの使用をサポートする場合、COMには別の利点があります。COMを使用すると、個々の関数だけでなく、オブジェクトをエクスポートできます。

ただし、COMは両刃の剣のようなものです。一方、COMオブジェクトをエクスポートすると、COMを非常によくサポートする一部の言語での作業がはるかに簡単になります。一方、そうでない言語では、生活がはるかに困難になる可能性があります。

1
Jerry Coffin