94

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

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

4

7 に答える 7

97

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();

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

于 2009-06-01T16:56:26.953 に答える
10

P/Invoke は優れたテクノロジであり、ターゲット DLL ファイルの読み込みの問題を除けば、かなりうまく機能します。最善の方法は、ネイティブ関数の静的ライブラリを作成し、それをそれに依存する Managed C++ (または C++/CLI) プロジェクトにリンクすることです。

于 2009-06-01T16:55:32.803 に答える
9

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

  • P/エクスポートされたライブラリ関数への呼び出し
  • COM タイプ ライブラリへの参照を追加します (COM オブジェクトを扱っている場合)。
于 2009-06-01T16:50:38.050 に答える
5

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

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

http://www.pinvoke.net/

于 2009-06-01T16:54:20.370 に答える
2

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

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

于 2009-06-01T16:49:10.457 に答える
2

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

于 2009-06-01T16:51:54.650 に答える
-2

Apache Thrift を検討したことがありますか?

http://thrift.apache.org/

それは非常にきちんとした解決策のようです。

于 2010-11-25T19:39:00.077 に答える