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

Posted

技术标签:

【中文标题】单声道嵌入,在不知道命名空间的情况下获取 MonoClass*【英文标题】:mono embedding, get MonoClass* without knowing the namespace 【发布时间】:2014-03-07 22:20:22 【问题描述】:

鉴于下面的 C# 示例代码,很容易从 C 中调用 Bar.Work 静态方法。只需获取 MonoClass*,然后从类中获取 MonoMethod* 并调用它。

问题是,为了获得MonoClass*,我需要向函数提供Bar 的命名空间,在这种情况下是'sampleApp' 作为参数。

MonoClass *klass = mono_class_from_name(image, "sampleApp", "Bar");

问题是如果我不知道Bar 的类命名空间,我如何在C 中获得MonoClass*。有没有办法从 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】:

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

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

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

【讨论】:

谢谢,我可能会简单地尝试从程序集 exe/dll 中推断出命名空间。如果没有找到,那么我会让它配置为命令行参数。无论如何,我只需要在启动时找到一个类。

以上是关于单声道嵌入,在不知道命名空间的情况下获取 MonoClass*的主要内容,如果未能解决你的问题,请参考以下文章

mono 真的实现了命名空间 System.AddIn.Hosting 吗?

单声道下的堆栈大小

将 System.Xml.Linq 与单声道命令行编译器一起使用

单声道嵌入,从 C 调用 C# 泛型方法

是否可以在不重新编码的情况下将立体声合并/缩混为单声道(m4a 或 opus)

如何在不阻塞的情况下渲染具有两个通量场的对象?