[英]Passing C# enum from C++ using mono
为什么不能为需要枚举的方法获取MonoMethod *,
有没有办法列出mono知道的方法?
这是我要尝试做的简化示例。 我尝试了(Windows)ildasm报告的不同组合,但未成功。
// enum.cs
namespace EnumTest
{
class EnumClass
{
public enum HelloType { Hi, Hey, Howdy, Greetings, Aloha };
public static void SetDefault() { type_ = HelloType.Hi; }
public static void SetType(HelloType h) { type_ = h; }
public static HelloType type_;
}
}
// enum.cpp
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>
int main(int argc, char* argv[]) {
MonoDomain* domain = mono_jit_init("enum.dll");
MonoAssembly* assembly = mono_domain_assembly_open(domain, "enum.dll");
MonoImage* image = mono_assembly_get_image(assembly);
MonoClass* enumClass = mono_class_from_name(image, "EnumTest", "EnumClass");
MonoMethodDesc* defaultDesc = mono_method_desc_new("EnumTest.EnumClass:SetDefault()", false);
MonoMethod* defaultMethod = mono_method_desc_search_in_class(defaultDesc, enumClass);
printf("defaultDesc from mono_method_desc_new() is %p\n", defaultDesc);
printf("defaultMethod from mono_method_desc_search_in_class() is %p\n\n", defaultMethod);
MonoMethodDesc* typeDesc = mono_method_desc_new("EnumTest.EnumClass:SetType(HelloType)", false);
MonoMethod* typeMethod = mono_method_desc_search_in_class(typeDesc, enumClass);
printf("typeDesc from mono_method_desc_new() is %p\n", typeDesc);
printf("typeMethod from mono_method_desc_search_in_class() is %p <------\n", typeMethod);
mono_jit_cleanup(domain);
}
$ mcs /nologo /warn:4 /debug:pdbonly /o /out:enum.dll /target:library enum.cs
$ gcc enum.cpp -g3 `pkg-config --cflags --libs mono-2` -o enum
$ ./enum
defaultDesc from mono_method_desc_new() is 0x1443920
defaultMethod from mono_method_desc_search_in_class() is 0x13dce40
typeDesc from mono_method_desc_new() is 0x1444590
typeMethod from mono_method_desc_search_in_class() is (nil) <------
$ uname -a
Linux U14-OOXML 3.16.0-37-generic #51~14.04.1-Ubuntu SMP Wed May 6 15:23:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
看起来参数类型需要完整的类型名称。
我用mono_method_full_name
以第二个参数的签名 true
拿到签名(我用相同的结构,但不同的名字我自己的测试类):
MonoDomain* domain = mono_jit_init(CSHARP_LIB);
MonoAssembly* assembly = mono_domain_assembly_open(domain, CSHARP_LIB);
MonoImage* image = mono_assembly_get_image(assembly);
MonoClass* sandboxClass = mono_class_from_name(image, "CSharp_ClassLibrary", "Sandbox");
void* ptr = 0;
MonoMethod* iter;
while ((iter = mono_class_get_methods(sandboxClass, &ptr)) != NULL)
{
printf("--------------------------------\n");
const char* name = mono_method_get_name(iter);
MonoMethodDesc* methodDesc = mono_method_desc_from_method(iter);
const char* paramNames = "";
mono_method_get_param_names(iter, ¶mNames);
printf("Name: %s\n", name);
printf("Full name: %s\n", mono_method_full_name(iter, true));
printf(" namespace: %s\n", methodDesc ->namespace);
printf(" class: %s\n", methodDesc ->klass);
printf(" name: %s\n", methodDesc ->name);
printf(" args: %s\n", methodDesc ->args);
printf(" num_args: %d\n", methodDesc ->num_args);
printf(" paramnames:%s\n", paramNames);
}
我收到的输出是这样的:
--------------------------------
Name: SetDefault
Full name: CSharp_ClassLibrary.Sandbox:SetDefault ()
namespace: CSharp_ClassLibrary
class: Sandbox
name: SetDefault
args: (null)
num_args: 0
paramnames:
--------------------------------
Name: SetType
Full name: CSharp_ClassLibrary.Sandbox:SetType (CSharp_ClassLibrary.Sandbox/HelloType)
namespace: CSharp_ClassLibrary
class: Sandbox
name: SetType
args: (null)
num_args: 0
paramnames:h
--------------------------------
Name: .ctor
Full name: CSharp_ClassLibrary.Sandbox:.ctor ()
namespace: CSharp_ClassLibrary
class: Sandbox
name: .ctor
args: (null)
num_args: 0
paramnames:
因此,要修复您的代码,只需在参数类型之前添加类名称:
MonoMethodDesc* typeDesc = mono_method_desc_new("EnumTest.EnumClass:SetType(EnumClass/HelloType)", false);
MonoMethod* typeMethod = mono_method_desc_search_in_class(typeDesc, enumClass);
至少对我来说,这很好!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.