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


回答:


90

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

より説明された例については、このブログ投稿をチェックしてください。


2
ブログ投稿のリンクが壊れています:(
Vidar

9

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

  • P /エクスポートされたライブラリ関数を呼び出す
  • COMタイプライブラリへの参照を追加します(COMオブジェクトを扱っている場合)。

9

P / Invokeは優れたテクノロジであり、ターゲットDLLファイルのロードの問題を除いて、かなりうまく機能します。物事を行うための最良の方法は、ネイティブ関数の静的ライブラリを作成し、それに依存するマネージC ++(またはC ++ / CLI)プロジェクトにリンクすることであることがわかりました。


コールバックとp / invokeで問題が発生しました。C ++ / CLIに切り替えると、これらの問題が解決されました。
MedicineMan



2

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.