在C ++中使用Very C#DLL

时间:2011-04-01 21:33:34

标签: c# c++ dll c++builder

我正在尝试使用一个C#DLL,它在Embarcadero C ++ Builder中有多个.NET类和C#类的引用。 类似于Point类和String类以及Delegates。

我想知道> NET引用或C#是否会让我搞砸了。我正准备把它搞定,但我想知道我遇到的一些问题是否可能是由C ++引起的,不想发挥好。

3 个答案:

答案 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