20

アンマネージC++から.NETコードを呼び出したい。私のプロセスエントリポイントは.NETベースなので、CLRのホスティングについて心配する必要はありません。.NETオブジェクトのCOMラッパーを使用して実行できることは知っていますが、管理対象クラスの個々の静的メソッドにアクセスしたいので、COMは私の最短/最も簡単なルートではありません。

4

6 に答える 6

23

このソリューションを見てください: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports このソリューションでは、関数を [DllExport] 属性 (P/Invoke DllImport の反対) で装飾することにより、C から C# 関数を呼び出すことができます。 .

例:

C# コード

class Test
{
     [DllExport("add", CallingConvention = CallingConvention.StdCall)]
     public static int Add(int left, int right)
     {
         return left + right;
     } 
}

C コード:

 extern "C" int add(int, int);

 int main()
 {
      int z = add(5,10);
      printf("The solution is found!!! Z is %i",z);
      return 0;
 }

出力:

The solution is found!!! Z is 15

更新:コメントに質問と良い答えがあります:

アンマネージ プロジェクトに dll を含めるにはどうすればよいですか?

C# コードのコンパイル時に生成される .lib ファイルにリンクする必要があります ( https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396 )

于 2011-07-22T20:09:12.297 に答える
7

GCHandleクラスとgcrootキーワードを見てください。これは、GCHandleのタイプセーフなテンプレートラッパーを提供します。

これらを使用して、ネイティブコードでCLRオブジェクト(またはボックス化された値)への参照を保持できます。

MSDNには、ここに基本的なチュートリアルがあります。

于 2008-10-22T11:44:32.503 に答える
6

/clr でコンパイルされた混合モード アセンブリで実行されるネイティブ C++ だけでなく、実際のアンマネージ コードについて話していると仮定すると、C++/CLI で .NET コードのラッパーを作成するのが最も簡単な方法です。その後、__declspec(dllexport) でマークするだけで、C++/CLI メソッドをエクスポートできます。

または、アンマネージ コードの呼び出しを制御できる場合は、関数ポインターを .NET メソッドにマーシャリングし、それらをアンマネージ コードに渡すことができます。

于 2008-10-22T11:27:16.657 に答える
4

あなたはリバース PInvoke を探していると思います。逆ピンボークをグーグルで検索すると、役立つエントリがたくさん得られます。次の例は、手っ取り早く汚い例だと思います。

PInvoke-リバース PInvoke と __stdcall - __cdecl

于 2008-10-30T17:27:08.617 に答える
1

/clrあなたの呼び出しコードは、有効になっている C++ です。右?

はいの場合は、using ステートメントを使用して、コードで .NET dll を使用できます。何かのようなもの:

#using <Mydll.dll>

次に、マネージド クラスのオブジェクトを次のように簡単に作成できます。

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

この obj をクラスのデータ メンバーにしたい場合は、gcroot を使用するのがよい方法です。

于 2008-10-22T12:04:31.743 に答える