Форум программистов, компьютерный форум, киберфорум
Mono
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
1

Вызов функции из c# с параметром в виде класса

26.11.2020, 18:45. Просмотров 1091. Ответов 11
Метки c++, mono (Все метки)

Доброй ночи, как я могу вызвать функцию из C # с параметром в вид класса? Я пробовал это, но не работает, вылетает

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        auto obj = api->loader->CreateNewObject("System","Version");
        mono_runtime_object_init(obj);
        void* args[1];
        args[0] = &obj;
        api->loader->CallMethod("Main:OnUpdate()");
        api->loader->CallMethod("Main:OnTest(System.Version)", args);
 
       MonoObject* CreateNewObject(const char* name_space,const char* name)
       {
        mono_thread_attach(domain);
        MonoClass* klass = mono_class_from_name(mono_get_corlib(), name_space, name);
        if (klass)
            return mono_object_new(domain, klass);
        else
            printf("[Debug] klass is null !\n");
        return 0;
        }
Си шарп код который хочу вызвать
C#
1
2
3
4
 public void OnTest(System.Version args)
    {
        System.Console.WriteLine(args);
    }
Был бы бесконечно благодарен если поможете
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2020, 18:45
Ответы с готовыми решениями:

Преобразовать вызов метода класса с параметром в функцию с двумя параметрами
Можно ли при помощи адаптеров преобразовать выражение типа x->Func(y) в выражение Func(x,y)? Нужно...

Можно ли сделать поле класса параметром функции-члена этого же класса?
Здраствуйте. ref class MyClass { private: int i, j; array<array<int>^>^ X1; ...

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при...

Вызов функции с параметром ссылкой
Доброго всем дня! Столкнулся с проблемой, что если вызвать функция через адресною строку с...

11
Администратор
Эксперт .NET
12881 / 10502 / 4354
Регистрация: 17.03.2014
Сообщений: 21,180
Записей в блоге: 1
26.11.2020, 19:28 2
UnknownsS, переменная api что хранит?
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
26.11.2020, 20:44  [ТС] 3
OwenGlendower,
C++
1
2
3
4
5
class Pars
{
public:
    MonoLoader* loader;
};
Добавлено через 1 минуту
OwenGlendower,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class MonoLoader
{
private:
    MonoDomain* domain = nullptr;
    MonoAssembly* assembly = nullptr;
    MonoImage* image = nullptr;
    MonoObject* objA = nullptr;
    MonoClass* dogclass = nullptr;
public:
 
    MonoLoader(const char* domainName, const char* pathFile, const char* class_name, const char* name_space)
    {
        mono_set_dirs("C:\\Program Files\\Mono\\lib", "C:\\Program Files\\Mono\\etc");
 
        if (!domain)
            this->domain = mono_jit_init(domainName);
        assembly = mono_domain_assembly_open(domain, pathFile);
 
        image = mono_assembly_get_image(assembly);
 
        dogclass = mono_class_from_name(image, name_space,class_name);
        this->objA = mono_object_new(domain, dogclass);
 
        if (!assembly)
        {
            ERROR("[Error] Assembly is null\n");
        }
        if (!image)
        {
            ERROR("[Error] image is null\n");
        }
        if (!dogclass)
        {
            ERROR("[Error] dogclass is null\n");
        }
    }
 
    MonoObject* CreateNewObject(const char* name_space,const char* name)
    {
        mono_thread_attach(domain);
        MonoClass* klass = mono_class_from_name(mono_get_corlib(), name_space, name);
        if (klass)
            return mono_object_new(domain, klass);
        else
            DBG("Klass is null !\n");
        return 0;
    }
 
    void CallMethod(const char* BarkMethodDescStr, void* params[])
    {
        mono_thread_attach(domain);
        MonoMethodDesc* BarkMethodDesc;
 
        BarkMethodDesc = mono_method_desc_new(BarkMethodDescStr, NULL);
 
        MonoMethod* method;
        method = mono_method_desc_search_in_image(BarkMethodDesc, image);
 
        mono_runtime_invoke(method, objA, params, nullptr);
    }
};
0
Администратор
Эксперт .NET
12881 / 10502 / 4354
Регистрация: 17.03.2014
Сообщений: 21,180
Записей в блоге: 1
26.11.2020, 22:49 4
UnknownsS, а где вылетает код?
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
26.11.2020, 22:52  [ТС] 5
OwenGlendower, в вызове OnTest

Добавлено через 44 секунды
OwenGlendower,
C++
1
api->loader->CallMethod("Main:OnTest(System.Version)
0
Администратор
Эксперт .NET
12881 / 10502 / 4354
Регистрация: 17.03.2014
Сообщений: 21,180
Записей в блоге: 1
27.11.2020, 08:07 6
UnknownsS, я бы проверил что objA инициализировался. Ничего другого не могу предложить
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
27.11.2020, 12:03  [ТС] 7
OwenGlendower,
C++
1
 api->loader->CallMethod("Main:OnUpdate()");
Отрабатывает спокойно
0
Администратор
Эксперт .NET
12881 / 10502 / 4354
Регистрация: 17.03.2014
Сообщений: 21,180
Записей в блоге: 1
27.11.2020, 13:49 8
UnknownsS, логично. А если закоментировать вызов Console.WriteLine в методе OnTest?
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
27.11.2020, 13:50  [ТС] 9
OwenGlendower, все будет работать
0
Администратор
Эксперт .NET
12881 / 10502 / 4354
Регистрация: 17.03.2014
Сообщений: 21,180
Записей в блоге: 1
27.11.2020, 14:49 10
UnknownsS, тогда следующий тест - что будет при таком варианте
C#
1
2
3
4
 public void OnTest(System.Version args)
    {
        System.Console.WriteLine("OnTest");
    }
Если не отработает, то значит дело в классе Console. Иначе наверное в переменной args.
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
27.11.2020, 18:03  [ТС] 11
OwenGlendower, Работает

Добавлено через 2 часа 6 минут
OwenGlendower, Может дело в соглашении о вызове, только как его изменить для функций вызываемых с помощью mono ?
0
0 / 0 / 0
Регистрация: 24.09.2020
Сообщений: 8
27.11.2020, 18:09  [ТС] 12
OwenGlendower,
0
Миниатюры
Вызов функции из c# с параметром в виде класса  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2020, 18:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вызов функции с REAL8 параметром
Как вызвать функцию, принимающую параметр типа real8, через Invoke? Test proc a: real8 Test2...

Вызов функции с параметром в ответ на нажатие кнопки
Добрый день! Я - новичок в qt, подскажите, как реализовать вызов функции с параметром в ответ на...

Вызов функции с параметром через слоты-сигналы
Добрый вечер. Появился вопрос, как в QT можно реализовать вызов функции с параметром из другого...

Чем отличается вызов функции(sub) c параметром call от обычного вызова?
Чеи отличается вызов функции(sub) c параметром call от обычного вызова Example1: call...

Вызов метода класса в лямбде-функции, вызываемой в другом методе этого же класса
Здравствуйте. Помогите грамотно передать в лямбду метод класса. Упрощенно. Есть класс. В одном...

Вызов функции из одного класса кнопкой из другого класса
Доброго времени суток. Помогите разобраться с сигналами и слотами. Уже устал перечитывать не могу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.