首页 / C# / 使用Mono从C/C++调用C#
使用Mono从C/C++调用C#
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Mono从C/C++调用C#,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2535字,纯文字阅读大概需要4分钟。
内容图文
我需要在Linux上编写docx文件,因此我将Open-XML-SDK与mono进行了编译.我试图执行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
解决方法:
C#语言告诉您,类Hello的构造函数是Hello(string)是一个谎言,以使C和Java程序员更加熟悉它.
但是Mono运行时,像Microsoft .NET CLR一样,只能使用编译后的代码,而不是C#.每个实例构造函数的真实名称是.ctor(与类型名称无关),而对于类型初始值设定项(也称为“静态构造函数”)的真实名称是.cctor.如果您搜索.ctor(string)而不是Hello(string),那么您应该会成功.在线有一些working examples,一旦您知道要寻找的内容就更容易找到.
C#涉及名称的其他地方是默认索引器,嵌套类型,闭包……实际上很多.在所有这些情况下,您都可以通过使用反汇编程序(.NET中的ildasm,不确定等效的Mono工具的名称)来查看元数据中存在的真实命名约定.
内容总结
以上是互联网集市为您收集整理的使用Mono从C/C++调用C#全部内容,希望文章能够帮你解决使用Mono从C/C++调用C#所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。