Тема: Бiблiотека Mono i трабл з нею.
Маю я програму яка написана на С++ але там я юзаю ще бiблiотеку на С# i mono для того щоб одне з другим працювало.
От в чому трабл.
Написав функцiю для виклику функцiй з С# (вибачаюся за тофтологiю).
Ну все було добре поки я не викликав функцiю C# з двома числовими аргументами.
I виявилося що перший аргумент = другому.
Тобто викликаю так що перший параметр мав бути 3 а другий 5 але вони обидва рiвнi 5.
Може тут пiдкажуть що робити.
Функцiя з С#
public void Name(int param0, int param1, int param2, string param3, string param4, string param5)
{
}
MonoObject* CallScript(const char* name, char* pdescription, ...)
{
va_list args;
int num = strlen(pdescription);
va_start(args, pdescription);
std::vector<void*> arg;
int a = 0;
char* chars = { 0 };
for (int i = 0; i < num; i++)
{
switch (pdescription[i])
{
case 'i':
a = va_arg(args, int);
arg.push_back(&a);
printf("DB: %i\n", a);
break;
case 's':
chars = va_arg(args, char*);
arg.push_back(mono_string_new_len(mono_domain_get(), chars, (int)strlen(chars)));
break;
default:
break;
}
}
printf("\n\n\n");
void** argscall = &arg[0];
MonoImage* img = mono_assembly_get_image(mono_domain_assembly_open(mono_domain_get(), "UnityEngine"));
MonoClass* m_class = mono_class_from_name(img, "UnityEngine", "GameObject");
MonoMethod* Find = findMethod(m_class, "Find");
void *object_name[] = { mono_string_new_len(mono_domain_get(), "Inst", (int)strlen("Inst")) };
MonoObject* Inst= mono_runtime_invoke(Find, nullptr, object_name, nullptr);
static const char *names[] = { "System.String" };
MonoString* Name = mono_string_new_len(mono_domain_get(), "Net", (int)strlen("Net"));
MonoMethod* GetComponent = findMethod(m_class, "GetComponent", 1, names);
void *args1[] = { Name };
MonoObject* RK = mono_runtime_invoke(GetComponent, Inst, args1, NULL);
if (!RK) return NULL;
MonoImage* img_asm = mono_assembly_get_image(mono_domain_assembly_open(mono_domain_get(), "Assembly-CSharp"));
MonoClass* rak_class = mono_class_from_name(img_asm, "", "Net");
MonoMethod* CallMethod = findMethod(rak_class, name);
if (!CallMethod) { printf("ERR 03\n"); return NULL; }
return mono_runtime_invoke(CallMethod, Inst, argscall, nullptr);
}
MonoMethod* findMethod(MonoClass* mclass, const char *name, int num_args, const char **arg_typenames)
{
if (arg_typenames != nullptr) {
for (MonoClass* mc = mclass; mc; mc = mono_class_get_parent(mclass)) {
MonoMethod *method;
gpointer iter = nullptr;
while ((method = mono_class_get_methods(mclass, &iter))) {
if (strcmp(mono_method_get_name(method), name) != 0) { continue; }
MonoMethodSignature *sig = mono_method_signature(method);
if (mono_signature_get_param_count(sig) != num_args) { continue; }
MonoType *mt = nullptr;
gpointer iter = nullptr;
for (int ia = 0; ia < num_args; ++ia) {
mt = mono_signature_get_params(sig, &iter);
if (strcmp(mono_type_get_name(mt), arg_typenames[ia]) != 0) {
goto next_method;
}
}
return method;
next_method:;
}
}
}
else {
for (MonoClass* mc = mclass; mc; mc = mono_class_get_parent(mclass)) {
if (MonoMethod *ret = mono_class_get_method_from_name(mc, name, num_args)) {
return ret;
}
}
}
return nullptr;
}
Сам виклик
CallScript("Name", "iissss", ну i тут параметри через кому)