我需要在Linux上编写docx文件,因此正在使用mono编译Open-XML-SDK。我尝试按照this website的建议操作。
我该怎么做才能了解为什么无法获取构造函数的MonoMethod*对象,或者更好地让它正常工作?
以下是我的示例程序和输出:
// hello.cs
using System;
namespace HelloWorld
{
class Hello
{
public Hello(string s) { _s = s; }
public void DoSomething(string s) { _s = s; }
public string _s;
}
}
// hello.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("hello.dll");
MonoAssembly* assembly = mono_domain_assembly_open(domain, "hello.dll");
MonoImage* image = mono_assembly_get_image(assembly);
MonoClass* helloClass = mono_class_from_name(image, "HelloWorld", "Hello");
MonoMethodDesc* ctorDesc = mono_method_desc_new("HelloWorld.Hello:Hello(string)", false);
MonoMethod* ctorMethod = mono_method_desc_search_in_class(ctorDesc, helloClass);
printf("ctorDesc from mono_method_desc_new() is %p\n", ctorDesc);
printf("ctorMethod from mono_method_desc_search_in_class() is %p <----\n", ctorMethod);
MonoMethodDesc* doDesc = mono_method_desc_new("HelloWorld.Hello:DoSomething(string)", false);
MonoMethod* doMethod = mono_method_desc_search_in_class(doDesc, helloClass);
printf("doDesc from mono_method_desc_new() is %p\n", doDesc);
printf("doMethod from mono_method_desc_search_in_class() is %p\n", doMethod);
mono_jit_cleanup(domain);
}
$ mcs /nologo /warn:4 /debug:pdbonly /o /out:hello.dll /target:library hello.cs /reference:WindowsBase.dll
$ gcc hello.cpp -g3 `pkg-config --cflags --libs mono-2` -o hello
$ ./hello
ctorDesc from mono_method_desc_new() is 0x22b1920
ctorMethod from mono_method_desc_search_in_class() is (nil) <----
doDesc from mono_method_desc_new() is 0x22b2590
doMethod from mono_method_desc_search_in_class() is 0x224ae38
$ 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
.ctor
,而不是C#为其C++-lite语法使用的伪名称吗? - Ben Voigt