[英]Debug a C# dll called from C++ (with Mono embedded)
[英]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
在命令行中轻松地将示例代码编译为exe
或dll
,然后使用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.