Mono c# 获取类

Posted

技术标签:

【中文标题】Mono c# 获取类【英文标题】:Mono c# Getting the class 【发布时间】:2020-04-03 19:31:16 【问题描述】:

我正在尝试使用单声道和 c++ 实例化一个类并调用 c# 类的函数。

我的代码是:

mono_config_parse(NULL);
mono_set_assemblies_path("C:\\Users\\Oriorii\\Desktop\\MonoTest\\MonoScripts\\dlls");

MonoDomain* domain = nullptr;
domain = mono_jit_init("MonoScripts");

MonoAssembly* assembly = mono_domain_assembly_open(domain, "CSharp.dll"); // works
MonoImage* image = mono_assembly_get_image(assembly); // works

mono_jit_exec(domain, assembly, argc, argv); 

MonoClass* klass = mono_class_from_name(image, nullptr, "Class1"); // fails


MonoMethodDesc* ctorDesc = mono_method_desc_new("Class1:Class1()", false); // works
MonoMethod* ctorMethod = mono_method_desc_search_in_class(ctorDesc, klass); // fails because klass is nullptr


MonoMethodDesc* doDesc = mono_method_desc_new("Class1::PrintTest()", false); // works
MonoMethod* doMethod = mono_method_desc_search_in_class(doDesc, klass); // fails because klass is nullptr


mono_jit_cleanup(domain);

而我的 c# 是:

using System;

public class Class1

    public void PrintTest()
    
        Console.WriteLine("HELLO!!");
    

问题出在这行'MonoClass* klass = mono_class_from_name(image, nullptr, "Class1");'该函数返回 nullptr 但下一行我执行 'MonoMethodDesc* ctorDesc = mono_method_desc_new("Class1:Class1()", false);'它不返回 nullptr。所以我不明白发生了什么。

我也尝试将 c# 类放入命名空间,但发生了同样的问题。

【问题讨论】:

【参考方案1】:

试一试

MonoClass* klass = mono_class_from_name(image, "", "Class1");

相反。这对我有用。

另外,如果你需要创建一个类实例而不需要向构造函数传递参数,你可以使用

MonoObject *ClassInstance = mono_object_new(domain, klass);
mono_runtime_object_init(ClassInstance);

由于您使用的是“Class1:Class1()”,因此您正在寻找构造函数的方式将不起作用。相反,它应该是“Class1:.ctor()”。 (请注意,ctor前面有句号。)

【讨论】:

以上是关于Mono c# 获取类的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 Mono 获取程序集类

从 c# 捕获本机异常并在它离开范围后获取 exception.what()

使用 Mono.Cecil 在 C# 程序集中注入方法

如何在 spring boot webflux 上从 mono<user> 获取用户名?

C#编写的winform程序使用mono脱离.net框架,调用open方法访问access使程序界面消失

Mono - 在 Linux 下获取磁盘分区