C++から任意のC#関数を呼び出すことができる必要があります。 http://www.infoq.com/articles/in-process-Java-net-integration は、ICLRRuntimeHost :: ExecuteInDefaultAppDomain()の使用を提案しますが、これにより、この形式のメソッドを呼び出すことができます。int method(string arg)
任意のC#関数を呼び出す最良の方法は何ですか?
/ clrフラグを使用してC++コードをコンパイルします。それにより、比較的簡単に任意の.NETコードを呼び出すことができます。
例えば:
#include <tchar.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
System::DateTime now = System::DateTime::Now;
printf("%d:%d:%d\n", now.Hour, now.Minute, now.Second);
return 0;
}
これは「C++」としてカウントされますか?まあ、明らかにそうではありません標準C++...
C++アプリケーションがC#DLLの関数を呼び出す方法はいくつかあります。
ICLRRuntimeHost::ExecuteInDefaultAppDomain()
)C++プログラム(またはその一部)が/ clrでコンパイルされるかどうか気にしない場合は、C++/CLIを使用して.NETコードを呼び出すだけです(参照を追加する限り)。 この記事を試してみてください 。
編集:ここにあります 素敵なチュートリアル
もう1つの方法は、C#コードをCOMとして公開することです。
最も簡単な方法は、COM相互運用機能を使用することです。
別の方法として、 Lua を使用してCLRオブジェクトをインスタンス化し、実行し、結果を返すことができます。
DLLにコンパイルされたC#コードの周囲に COM呼び出し可能ラッパー を使用できます。
DllExport を参照してください。
IOW:DllImport
の動作の正反対。
https://github.com/3F/DllExport
Windowsをサポートしており、クロスプラットフォームのサポートが進行中です。
C#コード(C++から呼び出します):
[DllExport]
public static int _add(int a, int b)
{
return a + b;
}
[DllExport]
public static bool saySomething()
{
DialogResult dlgres = MessageBox.Show(
"Hello from managed environment !",
".NET clr",
MessageBoxButtons.OKCancel
);
return dlgres == DialogResult.OK;
}
C++コード(以前のC#コードを呼び出します):
typedef int(__cdecl *_add)(int a, int b);
typedef bool(__cdecl *saySomething)();
auto pAdd = (_add)GetProcAddress(lib, "_add");
int c = pAdd(5, 7);
auto pSaySomething = (saySomething)GetProcAddress(lib, "saySomething");
bool dlgres = pSaySomething();
そして、 Managed&Unmanaged;のデモ付きのYouTubeビデオ。 PInvoke; [Conari vs DllExport] 。正直に言うと、ドキュメントは完璧を下回っていますが、それであなたを先送りにしないでください。YouTubeビデオは素晴らしいです。
このプロジェクトは、別の Robert Gieseckeのプロジェクト に触発されており、このプロジェクトには NuGetで220,000ダウンロード があります。
楽しい事実:いくつかのPythonライブラリは、これを使用してC++とC#を組み合わせた機能を実装しています。
そして最後に、ロバート・ギーゼッケとデニス・クズミン、すばらしい、すばらしい仕事に感謝します!
Microsoftから: カスタム.NETコアホストを記述して、ネイティブコードから.NETランタイムを制御します 。
IOW:WindowsとLinuxの両方でC++からC#を呼び出します。
GitHubのサンプルコード があります。
このサンプルコードはクロスプラットフォームで、.NET CoreのC#コードをLinuxとWindowsの両方のC++アプリケーションから呼び出すことができます。
正直なところ、このソリューションは、他のDllExport
回答と比較して非常に複雑なようです。 C++コードは、リソースやエントリポイントなどをスキャンするために多大な労力を費やしています。この答えの1つの引数は、クロスプラットフォームであることです。ただし、他のDllExport
回答もクロスプラットフォームであり、はるかに簡単に使用できます。