给定下面的C#示例代码,从C调用Bar.Work
静态方法非常容易。只需获取MonoClass*
,然后从类中获取MonoMethod*
并调用它。
问题是,为了获得MonoClass*
我需要提供Bar的名称空间,在本例中,该名称空间是作为参数提供给函数的'sampleApp'
。MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");
问题是,如果我不知道MonoClass*
的类名称空间,我如何才能获得C中的Bar
。有没有办法从C获取程序集中的类型列表?我在mono的嵌入示例中找不到任何示例。
C样本
namespace sampleApp
{
class Bar {
public static void Work() {
Console.WriteLine("Bar.Work called");
}
}
class Program {
public static void Main(string[] args) {
Console.WriteLine("Program.Main called");
}
}
}
从C呼叫
#include <mono/jit/jit.h>
#include <mono/metadata/mono-config.h>
#include <mono/metadata/metadata.h>
#include <mono/metadata/appdomain.h>
#include <mono/metadata/class.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/image.h>
#include <mono/metadata/object.h>
#include <mono/metadata/debug-helpers.h>
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, "sampleApp.exe");
MonoImage *image = mono_assembly_get_image(assembly);
mono_jit_exec(domain, assembly, argc, argv);
//how can I find Bar class if I don't know that it is under the sampleApp namespace?
MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");
MonoMethod *method = mono_class_get_method_from_name(klass, "Work", 0);
void *params[1] = { NULL };
mono_runtime_invoke(method, NULL, params, NULL);
mono_jit_cleanup(domain, assembly);
return 0;
}
最佳答案
Afaik,Unity正在使用固定函数来解决这个问题(Update(),Start())。这些是unity调用的函数,脚本中被调用的所有其他函数都必须在这个预定义函数中。
这就是脚本名必须与类名匹配的原因之一。他们只是搜索文件夹并使用脚本名作为类名。
不是你想要的答案,但我认为这是最好的解决办法。