使用 mono 从 C/C++ 调用 C#

Using mono to call C# from C/C++(使用 mono 从 C/C++ 调用 C#)

本文介绍了使用 mono 从 C/C++ 调用 C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在 Linux 上编写 docx 文件,所以我正在编译 Open-XML-SDK 与 mono.我正在尝试做 这个网站建议.

I need to write docx files on Linux so I'm compiling the Open-XML-SDK with mono. I'm trying to do what this website suggests.

我能做些什么来理解为什么我不能为构造函数获取 MonoMethod* 对象,或者更好的是,让它工作?

What can I do to understand why I can't get the MonoMethod* object for the constructor, or better, get this to work?

这是我的示例程序和输出:

Here are my sample programs and output:

// 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
", ctorDesc);
  printf("ctorMethod from mono_method_desc_search_in_class() is %p    <----
", 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
", doDesc);
  printf("doMethod from mono_method_desc_search_in_class() is %p
", 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

推荐答案

Hello类的构造函数是Hello(string)是C#语言的谎言, 让 C++ 和 Java 程序员更熟悉它.

That the constructor of class Hello is Hello(string) is a lie told by the C# language, to make it more familiar to C++ and Java programmers.

但 Mono 运行时,如 Microsoft .NET CLR,使用编译后的代码,而不是 C#.每个实例构造函数的真实名称是 .ctor,独立于类型名称,而 .cctor 是类型初始化器(又名静态构造函数").如果您搜索 .ctor(string) 而不是 Hello(string),您应该会成功.有一些 工作 例子 在线,一旦你知道要寻找什么就更容易找到.

But the Mono runtime, like the Microsoft .NET CLR, works with compiled code, not C#. The true name of every instance constructor is .ctor, independent of the type name, and .cctor for a type initializer (aka "static constructor"). If you search for .ctor(string) instead of Hello(string), you should meet with success. There are some working examples online, easier to find once you know what to look for.

C# 关于名称的其他地方是默认索引器、嵌套类型、闭包......实际上不少.在所有这些情况下,您都可以通过使用反汇编程序(.NET 中的 ildasm,不确定等效 Mono 工具的名称)来查看元数据中存在的真正命名约定.

Other places where C# lies about names are for default indexers, nested types, closures.... quite a few actually. In all these cases you can see the true naming convention present in the metadata by using a disassembler (ildasm in .NET, not sure about the name of the equivalent Mono tool).

这篇关于使用 mono 从 C/C++ 调用 C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:使用 mono 从 C/C++ 调用 C#

基础教程推荐