2011-04-01 3 views
0

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

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

+0

Подключите, вернитесь когда * это * работает. –

ответ

0

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

0

Или вы можете use the mono CLR embedder

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

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

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

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

предполагается, что вы получили соответствующий монометод * в 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); 

за дополнительной ценностью развлечения: если вы АОТ-компиляцию всего кода CIL , вы сможете статически связать свою сборку в ваш собственный двоичный файл (эффективно выполняющий то, что Managed C++ (C++ - cli) вызывает сборки смешанного режима). Посмотрите на

mono --aot=static myassembly.dll 

и

mkbundle 
+0

В этом случае это неуправляемый код, вызывающий управляемый код, который исключает p/invoke. – Joe

+0

Все в порядке, вы получили остальную часть сообщения? Оба способа поддерживаются :) – sehe

+0

Мне любопытно, как вы используете P/Invoke для вызова кода C# из собственного кода на C++? –

1

Я дал аналогичный answer вашей проблемы в this question.

Вы в основном хотите использовать интерфейс C++/CLI для своего кода на C#.

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

+0

Интересный, более легкий подход. Инициатива должна быть от C#, но вы можете перенести управление на собственный код и иметь callbakcs. Может быть очень полезно, спасибо – sehe

Смежные вопросы