web-dev-qa-db-ja.com

C#からC ++コードを呼び出すことは可能ですか?

C#などの.NET言語内から、おそらくコードライブラリファイル(.dll)としてコンパイルされたC++コードを呼び出すことは可能ですか?

具体的には、RakNetネットワークライブラリなどのC++コード。

81
yiingchau

C++を呼び出す簡単な方法の1つは、C++/CLIでラッパーアセンブリを作成することです。 C++/CLIでは、ネイティブコードを記述しているかのようにアンマネージコードを呼び出すことができますが、C#で記述したかのようにC#からC++/CLIコードを呼び出すことができます。この言語は基本的に、既存のライブラリへの相互運用機能を「キラーアプリ」として設計されました。

たとえば、/ clrスイッチを使用してこれをコンパイルします

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

次に、C#でManagedTypeアセンブリへの参照を追加し、次のように使用します。

ManagedType mt = new ManagedType();
mt.ManagedMethod();

詳細な例については、 このブログ投稿 をご覧ください。

85
Eclipse

私はあなたが言及したライブラリに精通していませんが、一般的にそうするためのいくつかの方法があります:

  • P/Invoke エクスポートされたライブラリ関数
  • COMタイプライブラリへの参照の追加(COMオブジェクトを処理する場合)。
7
Mehrdad Afshari

P/InvokeはNiceテクノロジーであり、ターゲットDLLファイルをロードする際の問題を除いて、かなりうまく機能します。ネイティブ関数のリストを作成し、それに依存するManaged C++(またはC++/CLI)プロジェクトにリンクします。

7
plinth

はい、 P/Invoke と呼ばれます。

Win32 APIで使用するための優れたリソースサイトを次に示します。

http://www.pinvoke.net/

3
Dana Holt

これを行うために使用される技術は P/Invoke ;と呼ばれます。そのテーマに関する記事を検索できます。これは、C++ではなくC#からCを呼び出すためのものです。そのため、C++コードをDLLエクスポートするCラッパーにラップする必要があります。

1

確かです。 この記事 は、これを始めるためにできることの良い例です。

P/Invoke を使用して、Windows MobileデバイスのC#からこれを行います。

1
Mat Nadrofsky