单嵌入,在不知道命名空间的情况下获取MonoClass *

时间:2014-03-07 22:20:22

标签: c# c mono mono-embedding

考虑到下面的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

调用Bar.Work
#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;
} 

1 个答案:

答案 0 :(得分:2)

Afaik,Unity正在使用固定功能来解决这个问题(Update(),Start())。这些是统一调用的函数,被调用的脚本的所有其他函数必须在这个预定义的函数中。

这就是脚本名称必须与类名匹配的原因之一。他们只搜索文件夹并使用脚本名称作为类名。

不是你想要的答案,但我认为这是最佳解决方案。

相关问题