繁体   English   中英

使用C ++和嵌入式Mono调用C#DLL时无法加载汇编系统

[英]Could not load assembly System when using C++ and embedded mono to call to C# DLL

我有一个C#示例代码,该代码在Linux上使用xbuild编译为DLL,例如:

using System;
using System.IO;
using System.Collections.Generic;
// ...

namespace MySamples
{
public class MyExample
{
    public static void test()
    {
        SortedSet<int> ss = new SortedSet<int>();
    } 
    // main function calls for test()
}
}

我可以使用xbuild MyExample.csproj在命令行中轻松地将示例代码编译为exedll ,然后使用mono MyExample.exe运行-一切正常,示例代码返回预期结果。

现在,我想从我的C ++代码中调用示例代码,尤其是test()函数。 我为此使用了单声道运行时,这是我的C ++代码:

#include <mono/jit/jit.h>
#include <mono/metadata/object.h>
#include <mono/metadata/environment.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/mono-config.h>

// ...
MonoDomain* domain = mono_jit_init("MyExample.dll");
MonoAssembly* assembly = mono_domain_assembly_open(domain, "MyExample.dll");
mono_config_parse("MyExample.dll.config");

// mono is not installed in default locations:
mono_set_dirs("mypath/lib/mono", "mypath/etc/mono");

MonoImage* image = mono_assembly_get_image(assembly);

MonoClass* klass = mono_class_from_name(image, "MySamples", "MyExample");
MonoObject* object = mono_object_new(domain, klass);
mono_runtime_object_init(object);

// call test()
MonoMethodDesc* mdesc = mono_method_desc_new(":test()", false);
MonoMethod* method = mono_method_desc_search_in_class(mdesc, klass);
mono_runtime_invoke(method, object, NULL, NULL);

// shutdown the runtime
mono_jit_cleanup (domain);

C ++代码在运行时返回错误类型:

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = ...'或其依赖项之一。 ...

因为我知道如果我通过命令行使用mono运行相同的代码并且可以正常工作,那么我感觉C ++代码以及如何设置Mono运行时存在问题。 由于我的Mono未安装到默认目录(它是从源代码构建的)中,因此我通过添加mono_set_dirs修复了许多其他错误。

我在Ubuntu 16.04上,如果很重要,mono是从源代码构建的,CMake用于编译我的C ++代码,以及MyExample.dll.config内容:

<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>    
</configuration>

*.csproj文件以以下方式包括System

<Reference Include="System" />

再一次,当我从命令行(而不是从C ++项目)使用mono和现在的C#设置时,我能够运行test()

这是另外一件奇怪的事情 :如果我用List<int>替换SortedSet<int> List<int> ,它将运行而不会引发任何错误。 怎么可能? - 它们属于同一名称空间 我检查了其他类型,并在初始化大多数类型时引发了异常。

有什么主意在这里吗? 我一直在检查单声道嵌入式文档,以尝试找出设置方面的问题,但这是我所能及的。 我是C#,Mono运行时和嵌入式Mono的初学者。

问题是如此的微不足道-我在C ++代码中弄乱了mono lib路径。 显然,您需要提供一个前缀,而不是完整路径。 因此,就我而言,我必须使用:

mono_set_dirs("mypath/lib", "mypath/etc");

最后不使用mono

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM