gpt4 book ai didi

c# - 使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统

转载 作者:行者123 更新时间:2023-11-28 04:59:28 25 4
gpt4 key购买 nike

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

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++ 代码在运行时返回错误类型:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=...' or one of its dependencies. ...

因为我知道如果我使用 mono 运行相同的代码通过命令行并且它有效,我觉得我的 C++ 代码和我如何设置单声道运行时有问题。我通过添加 mono_set_dirs 修复了一些其他错误因为我的 Mono 没有安装到默认目录中(它是从源代码构建的)。

我在 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" />

再一次,我能够运行 test()使用 mono 时从命令行(而不是从 C++ 项目)使用 C# 设置,因为它们现在是。

还有一件奇怪的事:如果我替换SortedSet<int>List<int> ,它运行时不会抛出任何错误。怎么会这样? - they belong to the same namespace .我检查了其他类型,并且在初始化大多数类型时,抛出了异常。

知道这里出了什么问题吗?我一直在检查 mono embedded docs试图找出我的设置可能有什么问题,但这是我所能达到的。我是 C#、单声道运行时和嵌入式单声道的初学者。

最佳答案

问题是如此微不足道 - 我搞砸了我的 C++ 代码中的单声道库路径。显然,您需要提供前缀,而不是完整路径。所以,就我而言,我不得不使用:

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

最后不使用 mono

关于c# - 使用 C++ 和嵌入式单声道调用 C# DLL 时无法加载程序集系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46434387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com