Embarcadero C++ Builderの.NETクラスとC#クラスへの複数の参照を持つC#DLLを使用しようとしています。 PointクラスとStringクラス、そしてDelegatesのようなものです。C++でのC#DLLの使用
> NETのリファレンスまたはC#のものが何とか私を混乱させるのだろうかと思います。私はちょうどそれに夢中になっていますが、私はいくつかの問題がC++によって引き起こされる可能性があるかどうか疑問に思っています。
Embarcadero C++ Builderの.NETクラスとC#クラスへの複数の参照を持つC#DLLを使用しようとしています。 PointクラスとStringクラス、そしてDelegatesのようなものです。C++でのC#DLLの使用
> NETのリファレンスまたはC#のものが何とか私を混乱させるのだろうかと思います。私はちょうどそれに夢中になっていますが、私はいくつかの問題がC++によって引き起こされる可能性があるかどうか疑問に思っています。
C++で.NETコンテンツを使用するには、C++/CLIを使用する必要があります。また、独自のAppDomainを設定することもできますが、C++には.NETとの対話機能がまったくないため、これらは唯一の2つの選択肢です。
マネージドコードがlow-level Mono embedding APIを使用して[P /呼び出しまたはを使用して]、二つの方法でアンマネージコードを呼び出すことができます。
これはPerl、Python、Rubyのインタプリタ(実際には仮想マシン)をC/C++実行可能ファイルに埋め込んだようなものです。私は(まだ)このためガブガブ飲む(++)のラッパージェネレータのようなものが実際にあると思いますが、ここではCILコードへの呼び出しがどのように見えるかのスニペットではありません。
あなたを想定しclass MyClass {
static void Foo (int value) {
...
}
int Bar (string name) {
...
}
}
foo_methodとbar_methodに対応するMonoMethod *を持って、this_argはタイプのMyClassのMonoObject *である、あなたは、単に実行します。余分なエンターテイメントとしての価値については
/* we execute methods that take one argument */
void *args [1];
int val = 10;
/* Note we put the address of the value type in the args array */
args [0] = &val;
/* execute Foo (10);
* it's a static method, so use NULL as the second argument.
*/
mono_runtime_invoke (foo_method, NULL, args, NULL);
/* a string is a reference, so we put it directly in the args array */
args [0] = mono_string_new (domain, "Hello");
/* execute my_class_instance.Bar ("Hello");
* See the Creating Objects section to learn how to get this_arg.
*/
MonoObject *result = mono_runtime_invoke (bar_method, this_arg, args, NULL);
/* we always get a MonoObject* from mono_runtime_invoke(), so to get
* the integer value we need to unbox (which returns a pointer to
* the value stored in the object) and dereference.
*/
int int_result = *(int*)mono_object_unbox (result);
:あなたのCILコードのすべてをAOTコンパイル場合、アセンブリを静的にリンクすることができますにあなたのネイティブバイナリ(効果的にManaged C++(C++ - cli)が混合モードアセンブリを呼び出す)を実行します。
mono --aot=static myassembly.dll
と
mkbundle
を見て私はthis questionにあなたの問題に類似したanswerを与えました。
基本的には、C#コードへのC++/CLIインターフェイスが必要です。
C#デリゲートをC++コードに渡す場合は、Marshal::GetFunctionPointerForDelegate()
(MSDN)を使用して変換できます。これによりToPointer()
を呼び出して関数ポインタとして渡すことができるIntPtr
が得られます。
興味深く、より軽量なアプローチ。この取り組みはC#のものでなければなりませんが、コントロールをネイティブコードに戻してコールバックを持つことができます。非常に便利です、ありがとう – sehe
*それが動作するときに戻ってきてください。 –