Вызов неуправляемых методов из управляемого кода - PullRequest
1 голос
/ 29 февраля 2012

Давайте предположим, что у меня есть неуправляемый класс Test :

class Test
{
public:
    int SomeMethod(int a, bool b);
};

Чтобы создать новый экземпляр Test, я бы:

Test *test = new Test();

Моя цельзаключается в том, чтобы встроить Mono, чтобы управляемый код мог вызывать неуправляемые методы (например, Test::SomeMethod) в конкретном объекте.Я представляю этот объект путем передачи указателя этого объекта в управляемый метод, например так:

void *args[1];
args[0] = &test;

mono_runtime_invoke(init, NULL, args, NULL);

Вот как выглядит вызываемый управляемый метод:

public static void Init(IntPtr test)
{

}

Отсюда, как я могу вызвать Test.SomeMethod?

Я думал об использовании инструкции CALLI, используя System.Reflection.Emit, но как я могу ссылаться на объект, указатель которого test (первыйпараметр Init) имеет в виду?

Я не хочу использовать DllImport.

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Вас может заинтересовать CXXI ​​.Он создает управляемую сборку на основе ваших заголовков C ++ и позволяет вам работать с объектами C ++, как если бы они были обычными управляемыми объектами.

Насколько я понимаю, он еще не закончен и работает только с скомпилированным кодом C ++по GCC.

0 голосов
/ 01 марта 2012

Вы можете использовать внутренний вызов, если не хотите использовать DllImport.См. https://github.com/mono/mono/blob/master/samples/embed/teste.c вызов mono_add_internal_call () и код C # в файле test.cs.Это работает в основном как DllImport, за исключением того, что для вас не выполняется маршаллинг (строковый объект в коде C # будет отображаться как MonoString * в коде C, а не как char *, например).

В любомВ этом случае обратите внимание, что как функция, к которой вы могли обращаться с помощью DllImport, так и указатель функции, зарегистрированный с помощью mono_add_internal_call (), должны быть функциями C, а не методами-членами C ++.

0 голосов
/ 29 февраля 2012

Не может быть сделано (или, по крайней мере, не должно быть сделано).

Вы пытаетесь напрямую смешать две совершенно разные среды выполнения - причина, по которой существует DLLImport, заключается в том, чтобы позволить компиляторуЧтобы решить эту проблему.

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

Управляемые среды, такие как .NET, имеют строгие правила типов, сборку мусора и другие функции, которые просто не работают с неуправляемым кодом и данными.

...