我正在尝试使用一个C#DLL,它在Embarcadero C ++ Builder中有多个.NET类和C#类的引用。 类似于Point类和String类以及Delegates。
我想知道> NET引用或C#是否会让我搞砸了。我正准备把它搞定,但我想知道我遇到的一些问题是否可能是由C ++引起的,不想发挥好。
答案 0 :(得分:1)
我在answer中为您的问题提供了类似的this question。
您基本上需要C#代码的C ++ / CLI接口。
如果要将C#委托传递给C ++代码,可以使用Marshal::GetFunctionPointerForDelegate()
(MSDN)进行翻译。这会为您提供一个IntPtr
,您可以调用ToPointer()
作为函数指针传入。
答案 1 :(得分:0)
您需要使用C ++ / CLI在C ++中使用任何.NET内容。您也可以设置自己的AppDomain,但这是唯一的两个选择,因为C ++根本没有本机与.NET交互的能力。
答案 2 :(得分:0)
或者你可以use the mono CLR embedder
托管代码可以通过两种方式调用非托管代码,[使用P / Invoke或] 使用low-level Mono embedding API 。
这很像在C / C ++可执行文件中旧式嵌入Perl,Python或Ruby'解释器'(实际上是虚拟机)。我不认为实际上存在这样的东西作为Swig(++)包装器生成器(但是),但是这里是对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);
获得额外的娱乐价值:如果您AOT编译所有CIL代码,您将能够将您的程序集静态链接到您的原生二进制文件中(有效地执行此操作)什么是托管C ++(c ++ - cli)调用混合模式程序集)。看看
mono --aot=static myassembly.dll
和
mkbundle