У меня возникли проблемы с выяснением того, как вызвать универсальный метод (как статический, так и нестатический) из C.
Самая большая проблема заключается в том, что вызов общих методов по сути недокументирован, в моно-репозитории нет примеров, но в документации есть упоминание о том, что это предположительно возможно:
If you want to invoke generic methods, you must call the method on the "inflated" class, which you can obtain from the mono_object_get_class()
MonoClass *clazz;
MonoMethod *method;
clazz = mono_object_get_class (obj);
/*
* If there are more Add methods declared, you
* may use mono_method_desc_search_in_class (clazz, ":Add(T)"),
* you must substitute ":Add(T)" with the correct type, for example
* for List, you would use ":Add(int)".
*/
method = mono_class_get_method_from_name (clazz, "Add", 1);
mono_runtime_invoke (method, obj, args, &exception);
К сожалению, это не так уж полезно, поскольку не показывает полный пример, и независимо от того, что я делаю (используя mono_object_get_class или нет), я получаю предупреждение, за которым следует сбой при вызове общих методов.
* Assertion: should not be reached at marshal.c:4315
SIGABRT stracktrace...
Ниже пример класса C# и кода C, вызывающего его. Вызов неуниверсальных методов работает нормально, но я понятия не имею, как вызывать универсальные методы. Буду признателен за любые полезные советы.
Пример CSharp
namespace foo {
class MainClass {
public static void Main(string[] args) {
Console.WriteLine("Main");
}
public void GenericMember(T t) {
Console.WriteLine(t);
}
public static void GenericStatic(T t) {
Console.WriteLine(t);
}
public void NonGenericMember(string t) {
Console.WriteLine(t);
}
public static void NonGenericStatic(string t) {
Console.WriteLine(t);
}
}
}
Пример C
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
mono_config_parse(NULL);
MonoDomain *domain = mono_jit_init_version("app", "v4.0.30319");
MonoAssembly *assembly = mono_domain_assembly_open(domain, "foo.exe");
MonoImage *image = mono_assembly_get_image(assembly);
mono_jit_exec(domain, assembly, argc, argv);
MonoClass *klass = mono_class_from_name(image, "foo", "MainClass");
MonoObject *instance = mono_object_new(domain, klass)
MonoString *string = mono_string_new(domain, "hello");
void *params[] = { string };
//NonGenericStatic call (works)
MonoMethod *method = mono_class_get_method_from_name(klass, "NonGenericStatic", 1);
mono_runtime_invoke(method, NULL, params, NULL);
//NonGenericMember call (works);
method = mono_class_get_method_from(klass, "NonGenericMember", 1);
mono_runtime_invoke(method, instance, params, NULL);
//GenericStatic call (fails)
method = mono_class_get_method_from_name(klass, "GenericStatic", 1);
mono_runtime_invoke(method, NULL, params, NULL);
//GenericMember call (fails)
method = mono_class_get_method_from_name(klass, "GenericMember", 1);
mono_runtime_invoke(method, instance, params, NULL);
mono_jit_cleanup(domain, assembly);
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/222 ... hod-from-c
Моно-встраивание, вызов универсального метода C# из C ⇐ C#
Место общения программистов C#
-
Anonymous
1772094135
Anonymous
У меня возникли проблемы с выяснением того, как вызвать универсальный метод (как статический, так и нестатический) из C.
Самая большая проблема заключается в том, что вызов общих методов по сути недокументирован, в моно-репозитории нет примеров, но в документации есть упоминание о том, что это предположительно возможно:
If you want to invoke generic methods, you must call the method on the "inflated" class, which you can obtain from the mono_object_get_class()
MonoClass *clazz;
MonoMethod *method;
clazz = mono_object_get_class (obj);
/*
* If there are more Add methods declared, you
* may use mono_method_desc_search_in_class (clazz, ":Add(T)"),
* you must substitute ":Add(T)" with the correct type, for example
* for List, you would use ":Add(int)".
*/
method = mono_class_get_method_from_name (clazz, "Add", 1);
mono_runtime_invoke (method, obj, args, &exception);
К сожалению, это не так уж полезно, поскольку не показывает полный пример, и независимо от того, что я делаю (используя mono_object_get_class или нет), я получаю предупреждение, за которым следует сбой при вызове общих методов.
* Assertion: should not be reached at marshal.c:4315
SIGABRT stracktrace...
Ниже пример класса C# и кода C, вызывающего его. Вызов неуниверсальных методов работает нормально, но я понятия не имею, как вызывать универсальные методы. Буду признателен за любые полезные советы.
Пример CSharp
namespace foo {
class MainClass {
public static void Main(string[] args) {
Console.WriteLine("Main");
}
public void GenericMember(T t) {
Console.WriteLine(t);
}
public static void GenericStatic(T t) {
Console.WriteLine(t);
}
public void NonGenericMember(string t) {
Console.WriteLine(t);
}
public static void NonGenericStatic(string t) {
Console.WriteLine(t);
}
}
}
Пример C
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv) {
mono_config_parse(NULL);
MonoDomain *domain = mono_jit_init_version("app", "v4.0.30319");
MonoAssembly *assembly = mono_domain_assembly_open(domain, "foo.exe");
MonoImage *image = mono_assembly_get_image(assembly);
mono_jit_exec(domain, assembly, argc, argv);
MonoClass *klass = mono_class_from_name(image, "foo", "MainClass");
MonoObject *instance = mono_object_new(domain, klass)
MonoString *string = mono_string_new(domain, "hello");
void *params[] = { string };
//NonGenericStatic call (works)
MonoMethod *method = mono_class_get_method_from_name(klass, "NonGenericStatic", 1);
mono_runtime_invoke(method, NULL, params, NULL);
//NonGenericMember call (works);
method = mono_class_get_method_from(klass, "NonGenericMember", 1);
mono_runtime_invoke(method, instance, params, NULL);
//GenericStatic call (fails)
method = mono_class_get_method_from_name(klass, "GenericStatic", 1);
mono_runtime_invoke(method, NULL, params, NULL);
//GenericMember call (fails)
method = mono_class_get_method_from_name(klass, "GenericMember", 1);
mono_runtime_invoke(method, instance, params, NULL);
mono_jit_cleanup(domain, assembly);
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/22273150/mono-embedding-call-a-c-sharp-generic-method-from-c[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия