在C+中使用非常复杂的C#DLL+; 我尝试使用C++的DLL,它在NavaCabo+C++Builder中对.NET类和C类进行了多个引用。 像Point类、String类以及委托之类的东西

在C+中使用非常复杂的C#DLL+; 我尝试使用C++的DLL,它在NavaCabo+C++Builder中对.NET类和C类进行了多个引用。 像Point类、String类以及委托之类的东西,c#,c++,dll,c++builder,C#,C++,Dll,C++builder,我想知道是>网络引用还是C#引用会把我搞得一团糟。我正准备把它挂起来,但我想知道我所遇到的一些问题可能是因为C++不想玩得好。 < p>你需要使用C++ +CLI来使用C++中的.NET内容。您也可以建立自己的AppDevices,但只有两种选择,因为C++根本没有与.NET交互的本土化能力。< P>或者您可以< /P> 托管代码可以通过两种方式调用非托管代码,[使用p/invoke或]使用 这与传统的在C/C++可执行文件中嵌入Perl、Python或Ruby“解释器”(实际上是虚拟机)非常相

我想知道是>网络引用还是C#引用会把我搞得一团糟。我正准备把它挂起来,但我想知道我所遇到的一些问题可能是因为C++不想玩得好。

< p>你需要使用C++ +CLI来使用C++中的.NET内容。您也可以建立自己的AppDevices,但只有两种选择,因为C++根本没有与.NET交互的本土化能力。

< P>或者您可以< /P> 托管代码可以通过两种方式调用非托管代码,[使用p/invoke或]使用

这与传统的在C/C++可执行文件中嵌入Perl、Python或Ruby“解释器”(实际上是虚拟机)非常相似。我认为实际上还没有一个Swig(++)包装器生成器来实现这一点,但下面是对CIL代码的调用的一个片段:

 class MyClass {
    static void Foo (int value) {
      ...
    }

    int Bar (string name) {
      ...
    }
  }
假设您在foo_方法和bar_方法中得到了相应的MonoMethod*,并且该_参数是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代码,你就可以静态地将你的程序集链接到你的本地二进制(有效地做管理C++(C++ ++ CLI)调用混合模式程序集)。看

我给了你一个类似的答案

您基本上希望C++代码有一个C++/CLI接口


如果您想将C代表委托传递给C++代码,可以使用<代码> MsHal::GETFrimePoTeFuleDe委托()/<代码>()来翻译它。这将为您提供一个

IntPtr
,您可以调用
ToPointer()
,将其作为函数指针传入。

将其连接起来,工作时返回。在这种情况下,是非托管代码调用托管代码,这排除了p/invoke。好的,您是否获得了消息的其余部分?这两种方式都得到了支持:“我很好奇,你如何使用P/UnjCK调用来自原生C++代码的C代码?我也很好奇。为什么我有一个20行代码片段,2个Web引用,专门用来从C++代码调用C?,但是所有评论者都会碰到一个单词p/jokk?我想我会取消粗体字,因为我们所有编程的注意力跨度短的读者看不到其他东西……它仍然有一两个bug。我似乎只能使用该网站的工具而不是Embarcadero的导入功能创建一个功能齐全的TLB。大致相同的输出,但过程稍微复杂一些。一旦我弄清楚了原因,我会发布一个完整的答案。有趣的,更轻量级的方法。主动权必须来自C#,但您可以将控制权转移回本机代码并使用callbakcs。可能非常有用,谢谢
 mono --aot=static myassembly.dll
 mkbundle