Предпосылки / Описание проблемы Я пытаюсь запустить c# скрипты как часть моего приложения на C ++, которое я компилирую в Debian-9 Linux. Однако мое приложение вылетает из-за ошибки, исходящей из среды выполнения mono.
Я установил mono из репозиториев Debian и даже попробовал тот же эксперимент с версией mono, скомпилированной из исходников. Код c#, я скомпилировал в dll, используя mcs -t:library *.cs
. При попытке запустить мое приложение происходит сбой со следующей ошибкой:
* Assertion at object.c:116, condition `is_ok (error)' not met,
function:mono_runtime_object_init, (null) assembly:/usr/lib/mono/4.5/mscorlib.dll type:TypeInitializationException member:(null)
=================================================================
Native Crash Reporting
=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
=================================================================
Native stacktrace:
=================================================================
0x7f80f3fb9ccb - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f3fba069 - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f3f4479f - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f3fb9273 - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f3e5b510 - /lib/x86_64-linux-gnu/libpthread.so.0 :
0x7f80f3994081 - /lib/x86_64-linux-gnu/libc.so.6 : gsignal
0x7f80f397f535 - /lib/x86_64-linux-gnu/libc.so.6 : abort
0x7f80f3ea6f94 - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f41935f6 - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f41ae2db - /usr/lib/libmonosgen-2.0.so.1 :
0x7f80f41ae89d - /usr/lib/libmonosgen-2.0.so.1 : monoeg_assertion_message
0x7f80f40bf357 - /usr/lib/libmonosgen-2.0.so.1 : mono_runtime_object_init
0x561bf41542e0 - ./mono_test :
0x7f80f3980bbb - /lib/x86_64-linux-gnu/libc.so.6 : __libc_start_main
0x561bf415412a - ./mono_test :
.... more details follow ....
Минимальный пример Код C ++ (основной. cpp):
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <stdexcept>
int main(){
auto domain = mono_jit_init("MyApp");
auto assembly = mono_domain_assembly_open(domain, "hello.dll");
if (assembly == nullptr) {
throw std::runtime_error("Error loading mono assembly hello.dll");
}
auto image = mono_assembly_get_image(assembly);
auto mono_class = mono_class_from_name(image, "Test", "Hello");
if (mono_class == nullptr) {
throw std::runtime_error("Error finding class Test::Hello");
}
auto instance = mono_object_new(domain, mono_class);
mono_runtime_object_init(instance);
mono_jit_cleanup(domain);
}
C# код (hello.cs):
using System;
namespace Test {
class Hello {
Hello() {
Console.WriteLine("Hello constructor.");
}
void Update() {
Console.WriteLine("Yay update is called.");
}
}
}
CMakeLists:
cmake_minimum_required(VERSION 3.9)
project(mono_test)
set (CMAKE_CXX_FLAGS "-std=c++17")
file(GLOB SOURCES *.cpp)
add_executable(mono_test ${SOURCES})
INCLUDE(FindPkgConfig)
PKG_SEARCH_MODULE(MONO REQUIRED mono-2)
target_include_directories(mono_test SYSTEM PRIVATE ${MONO_INCLUDE_DIRS})
target_link_libraries(mono_test ${MONO_LIBRARIES})
Я читал разные учебники и пробовал разные вещи весь день (включая перекомпиляцию моно из исходного кода) без никакого успеха. У меня нет опыта встраивания моно и я действительно не знаю, как интерпретировать отчет cra sh или отлаживать его. Любая помощь будет принята с благодарностью.