web-dev-qa-db-ja.com

C ++からC#コードを呼び出す

C++から任意のC#関数を呼び出すことができる必要があります。 http://www.infoq.com/articles/in-process-Java-net-integration は、ICLRRuntimeHost :: ExecuteInDefaultAppDomain()の使用を提案しますが、これにより、この形式のメソッドを呼び出すことができます。int method(string arg)

任意のC#関数を呼び出す最良の方法は何ですか?

39
Gili

/ 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++...

25
Ðаn
48
cdiggins

C++プログラム(またはその一部)が/ clrでコンパイルされるかどうか気にしない場合は、C++/CLIを使用して.NETコードを呼び出すだけです(参照を追加する限り)。 この記事を試してみてください

編集:ここにあります 素敵なチュートリアル

もう1つの方法は、C#コードをCOMとして公開することです。

6
Filip Frącz

最も簡単な方法は、COM相互運用機能を使用することです。

3
laktak

別の方法として、 Lua を使用してCLRオブジェクトをインスタンス化し、実行し、結果を返すことができます。

1
David Robbins

DLLにコンパイルされたC#コードの周囲に COM呼び出し可能ラッパー を使用できます。

1
Dan Vinton

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#を組み合わせた機能を実装しています。

そして最後に、ロバート・ギーゼッケとデニス・クズミン、すばらしい、すばらしい仕事に感謝します!

1
Contango

Microsoftから: カスタム.NETコアホストを記述して、ネイティブコードから.NETランタイムを制御します

IOW:WindowsとLinuxの両方でC++からC#を呼び出します。

GitHubのサンプルコード があります。

このサンプルコードはクロスプラットフォームで、.NET CoreのC#コードをLinuxとWindowsの両方のC++アプリケーションから呼び出すことができます。

正直なところ、このソリューションは、他のDllExport回答と比較して非常に複雑なようです。 C++コードは、リソースやエントリポイントなどをスキャンするために多大な労力を費やしています。この答えの1つの引数は、クロスプラットフォームであることです。ただし、他のDllExport回答もクロスプラットフォームであり、はるかに簡単に使用できます。

0
Contango