質問

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

ありがとう!

役に立ちましたか?

解決

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

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

他のヒント

このソリューションを見てください: 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

GCHandle をご覧ください。クラスとGCHandleの型保証されたテンプレートラッパーを提供するgcrootキーワード。

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

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

Reverse PInvokeを探していると思います。逆ピンボーグをグーグルで検索すると、多くの役立つエントリが得られます。次の例は、迅速で汚い例です。

PInvoke -Reverse PInvokeおよび__stdcall-__cdecl

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

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

#using <Mydll.dll>

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

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

このオブジェクトをクラスのデータメンバーにしたい場合は、gcrootを使用する方法があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top