アンマネージC++から.NETコードを呼び出したい。私のプロセスエントリポイントは.NETベースなので、CLRのホスティングについて心配する必要はありません。.NETオブジェクトのCOMラッパーを使用して実行できることは知っていますが、管理対象クラスの個々の静的メソッドにアクセスしたいので、COMは私の最短/最も簡単なルートではありません。
6 に答える
このソリューションを見てください: 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 )
/clr でコンパイルされた混合モード アセンブリで実行されるネイティブ C++ だけでなく、実際のアンマネージ コードについて話していると仮定すると、C++/CLI で .NET コードのラッパーを作成するのが最も簡単な方法です。その後、__declspec(dllexport) でマークするだけで、C++/CLI メソッドをエクスポートできます。
または、アンマネージ コードの呼び出しを制御できる場合は、関数ポインターを .NET メソッドにマーシャリングし、それらをアンマネージ コードに渡すことができます。
あなたはリバース PInvoke を探していると思います。逆ピンボークをグーグルで検索すると、役立つエントリがたくさん得られます。次の例は、手っ取り早く汚い例だと思います。
/clr
あなたの呼び出しコードは、有効になっている C++ です。右?
はいの場合は、using ステートメントを使用して、コードで .NET dll を使用できます。何かのようなもの:
#using <Mydll.dll>
次に、マネージド クラスのオブジェクトを次のように簡単に作成できます。
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
この obj をクラスのデータ メンバーにしたい場合は、gcroot を使用するのがよい方法です。