アンマネージコードからマネージコードを呼び出す
質問
アンマネージ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 )
Reverse PInvokeを探していると思います。逆ピンボーグをグーグルで検索すると、多くの役立つエントリが得られます。次の例は、迅速で汚い例です。
あなたの呼び出しコードはC ++で、/ clrが有効になっています。右?
「はい」の場合、usingステートメントを使用して、コードで.NET dllを使用できます。次のようなもの:
#using <Mydll.dll>
そして、次のようにマネージクラスのオブジェクトを簡単に作成できます:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
このオブジェクトをクラスのデータメンバーにしたい場合は、gcrootを使用する方法があります。