Использование Very C # DLL в C ++ - PullRequest
0 голосов
/ 02 апреля 2011

Я пытаюсь использовать C # DLL, которая имеет несколько ссылок на классы .NET и C # классы в Embarcadero C ++ Builder. Такие вещи, как класс Point и класс String, а также делегаты.

Мне интересно, не помешают ли мне какие-нибудь ссылки на NET или C #. Я как раз собираюсь подключить его, но мне интересно, могут ли быть некоторые проблемы, которые у меня возникли, из-за того, что С ++ не хочет играть хорошо.

Ответы [ 3 ]

1 голос
/ 02 апреля 2011

Я дал похожий ответ на вашу проблему в этот вопрос .

В основном вам нужен интерфейс C ++ / CLI для вашего кода C #.

Если вы хотите передать делегат C # в код C ++, вы можете перевести его, используя Marshal::GetFunctionPointerForDelegate() ( MSDN ). Это дает вам IntPtr, который вы можете вызвать ToPointer() для передачи в качестве указателя на функцию.

0 голосов
/ 02 апреля 2011

Или вы можете использовать моно CLR Embedder

Управляемый код может вызывать неуправляемый код двумя способами: [с использованием P / Invoke или] с помощью низкоуровневого API встраивания Mono .

Это работает во многом как старомодное встраивание интерпретатора Perl, Python или Ruby (фактически, виртуальных машин) в исполняемый файл C / C ++. Я не думаю, что на самом деле есть такая вещь, как генератор оболочки Swig (++) для этого (пока), но вот фрагмент того, как выглядит вызов в CIL-код:

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

    int Bar (string name) {
      ...
    }
  }

при условии, что вы получили соответствующий MonoMethod * в foo_method и bar_method, а this_arg является MonoObject * типа MyClass, вы просто выполняете:

  /* 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
0 голосов
/ 02 апреля 2011

Вам потребуется использовать C ++ / CLI для использования любого содержимого .NET в C ++. Вы также можете настроить свой собственный домен приложений, но это только два варианта, поскольку C ++ вообще не имеет встроенной возможности взаимодействия с .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...