c# - 通过Mono将数组从C++传递到C#

标签 c# c++ .net linux mono

我需要使用mono将数组从C++传递到C#。但是我无法使mono_array_set()进行编译。那么如何将数组从C++传递给C#?

我试过了mono_runtime_invoke(),它可以编译但给出运行时错误。

mcs /nologo /warn:4 /debug:pdbonly /o /nowarn:3003 /platform:x64 /out:array.dll /target:library array.cs
g++ array.cpp -g3 `pkg-config --cflags --libs mono-2` -o array
<snip> 
array.cpp:32:5: note: in expansion of macro ‘mono_array_set’
// array.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("./array.dll");;
    MonoAssembly* assembly = mono_domain_assembly_open(domain, "./array.dll");
    MonoImage* image = mono_assembly_get_image(assembly);

    MonoClass* containsClass = mono_class_from_name(image, "IntArray", "ContainsAnInt");
    MonoMethodDesc* containsDesc = mono_method_desc_new("IntArray.ContainsAnInt:.ctor(int)", false);
    MonoMethod* containsCtor = mono_method_desc_search_in_class(containsDesc, containsClass);
    MonoObject* containsObject = mono_object_new(domain, containsClass);

    void* args[1];
    int value = 7;
    args[0] = &value;

    MonoObject* exception = NULL;
    mono_runtime_invoke(containsCtor, containsObject, args, &exception);

    MonoClass* unpackageClass = mono_class_from_name(image, "IntArray", "Unpackage");

    args[0] = containsObject;
    MonoMethodDesc* returnIntDesc = mono_method_desc_new("IntArray.Unpackage:ReturnInt(IntArray.ContainsAnInt)", true);
    MonoMethod* returnIntMethod = mono_method_desc_search_in_class(returnIntDesc, unpackageClass);
    mono_runtime_invoke(returnIntMethod, NULL, args, &exception); // <--- as expected, outputs "In ReturnInt: 7"

    MonoArray* theArray = mono_array_new(domain, containsClass, 1);
    //// Following will not compile
    mono_array_set(theArray, MonoClass*, 0, containsObject);
    ////
    MonoMethodDesc* returnElementDesc = mono_method_desc_new("IntArray.Unpackage:ReturnElement(IntArray.ContainsAnInt[])", true);
    MonoMethod* returnElementMethod = mono_method_desc_search_in_class(returnElementDesc, unpackageClass);
    mono_runtime_invoke_array(returnElementMethod, NULL, theArray, &exception); // <--- should output "In ReturnElement: 7"

    mono_jit_cleanup(domain);
}
// array.cs
using System;
using System.IO;

namespace IntArray {
    public class ContainsAnInt {
       public ContainsAnInt(int i) { IntValue = i;  }
       public int IntValue { get; set; }
    }
    public class Unpackage {
        public static int ReturnInt(ContainsAnInt n) {
            Console.WriteLine("In ReturnInt: " + n.IntValue); 
            return n.IntValue;
        }
        public static int ReturnElement(ContainsAnInt[] n) {
            Console.WriteLine("In ReturnElement: " + n[0].IntValue); 
            return n[0].IntValue;
        }
    }
}

最佳答案

这有效:

MonoArray* theArray = mono_array_new(domain, containsClass, 1);
mono_array_set(theArray, MonoObject*, 0, containsObject);
args[0] = theArray;
mono_runtime_invoke(returnElementMethod, NULL, args, &exception); // <--- as expected, outputs "In ReturnElement: 7"

关于c# - 通过Mono将数组从C++传递到C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30607688/

相关文章:

c# - 例如,如何将 DbSet 变成下拉列表?

c# - 将自定义 header 添加到 .Net 中的所有 Swagger 响应

c# - 三角形数的约数 (Euler 12)

c++ - 避免在共享库之间传递数据的开销

c++ - Visual Studio + CMake 的 GLOB_RECURSE

.net 处理传入的电子邮件

c# - 使用 ASP.NET Identity 和 JWT token 进行 Azure 函数身份验证

c# - 异步方法中的意外行为

c++ - 调试 400/400 = -858993460

c# - _ = Task.Run vs async void | Task.Run 与 Async Sub