Я встраивал моно в приложение basi c c ++, и у меня возникла проблема с печатью любых чисел, кроме 0, из сценария c#, из-за которого моя программа на c ++ выскакивает sh
Я создал следующий код c#
using System;
using Arc.Entity;
namespace ExampleApp
{
public class PlayerMovement : Entity
{
public void Start()
{
float test = 1.0f;
Console.WriteLine("Hello Start Method: {0}", test);
}
public void Update()
{
translate.x += 1.0f;
Console.WriteLine("Translation: ({0}, {1})", translate.x, translate.y);
}
}
}
, который просто выводит на консоль float, и загружаю файл dll, созданный в Visual Studio For Ma c, со следующим кодом.
C ++
#include <iostream>
#include <mono/jit/jit.h>
#include <mono/metadata/assembly.h>
#include <mono/metadata/debug-helpers.h>
int main(int argc, const char * argv[]) {
mono_set_dirs("/Library/Frameworks/Mono.framework/Versions/6.10.0/lib", "/Library/Frameworks/Mono.framework/Versions/6.10.0/etc");
MonoDomain* domain = mono_jit_init("Scripting_Engine");
MonoAssembly* assembly = mono_domain_assembly_open(domain, "/Desktop/ScriptingMacOSX/Build/Products/Debug/ExampleApp.dll");
MonoImage* image = mono_assembly_get_image(assembly);
if (!image)
{
std::cout << "Image Not Created" << std::endl;
} else {
std::cout << "Image Created" << std::endl;
}
MonoClass* scriptClass = mono_class_from_name(image, "ExampleApp", "PlayerMovement");
if(!scriptClass) {
std::cout << "Class Not Created" << std::endl;
} else {
std::cout << "Class Created" << std::endl;
}
MonoObject* scriptObject = mono_object_new(domain, scriptClass);
if(!scriptObject) {
std::cout << "Object Not Created" << std::endl;
} else {
std::cout << "Object Created" << std::endl;
}
mono_runtime_object_init(scriptObject);
void* iter = nullptr;
MonoMethod* method;
// Mono Methods
MonoMethod* startMethod = nullptr;
MonoMethod* updateMethod = nullptr;
std::string methodName = "Start";
while((method = mono_class_get_methods(scriptClass, &iter)))
{
if (strcmp(mono_method_get_name(method), "Start") == 0)
{
startMethod = method;
}
if (strcmp(mono_method_get_name(method), "Update") == 0)
{
updateMethod = method;
}
}
mono_runtime_invoke(startMethod, scriptObject, nullptr, nullptr);
while (true) {
mono_runtime_invoke(updateMethod, scriptObject, nullptr, nullptr);
}
return 0;
}
Этот процесс работает нормально, пока тестовая переменная в сценарии c# равна нулю. Как только он не равен нулю, возникает следующая ошибка.
System.TypeInitializationException: The type initializer for 'Sys' threw an exception. ---> System.DllNotFoundException: System.Native assembly:<unknown assembly> type:<unknown type> member:(null)
at (wrapper managed-to-native) Interop+Sys.LChflagsCanSetHiddenFlag()
at Interop+Sys..cctor () [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
--- End of inner exception stack trace ---
at System.Number.DoubleToNumber (System.Double value, System.Int32 precision, System.Number+NumberBuffer& number) [0x000b2] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Number.FormatSingle (System.Text.ValueStringBuilder& sb, System.Single value, System.ReadOnlySpan`1[T] format, System.Globalization.NumberFormatInfo info) [0x000d1] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Number.TryFormatSingle (System.Single value, System.ReadOnlySpan`1[T] format, System.Globalization.NumberFormatInfo info, System.Span`1[T] destination, System.Int32& charsWritten) [0x00015] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Single.TryFormat (System.Span`1[T] destination, System.Int32& charsWritten, System.ReadOnlySpan`1[T] format, System.IFormatProvider provider) [0x0000a] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Text.StringBuilder.AppendFormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) [0x00308] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.String.FormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) [0x00023] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.String.Format (System.IFormatProvider provider, System.String format, System.Object arg0) [0x00008] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.IO.TextWriter.WriteLine (System.String format, System.Object arg0) [0x00007] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.IO.TextWriter+SyncTextWriter.WriteLine (System.String format, System.Object arg0) [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
at (wrapper synchronized) System.IO.TextWriter+SyncTextWriter.WriteLine(string,object)
at System.Console.WriteLine (System.String format, System.Object arg0) [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
at ExampleApp.PlayerMovement.Start () [0x00007] in <6b3c479fe6974a38b024c98ff963d353>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.TypeInitializationException: The type initializer for 'Sys' threw an exception. ---> System.DllNotFoundException: System.Native assembly:<unknown assembly> type:<unknown type> member:(null)
at (wrapper managed-to-native) Interop+Sys.LChflagsCanSetHiddenFlag()
at Interop+Sys..cctor () [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
--- End of inner exception stack trace ---
at System.Number.DoubleToNumber (System.Double value, System.Int32 precision, System.Number+NumberBuffer& number) [0x000b2] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Number.FormatSingle (System.Text.ValueStringBuilder& sb, System.Single value, System.ReadOnlySpan`1[T] format, System.Globalization.NumberFormatInfo info) [0x000d1] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Number.TryFormatSingle (System.Single value, System.ReadOnlySpan`1[T] format, System.Globalization.NumberFormatInfo info, System.Span`1[T] destination, System.Int32& charsWritten) [0x00015] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Single.TryFormat (System.Span`1[T] destination, System.Int32& charsWritten, System.ReadOnlySpan`1[T] format, System.IFormatProvider provider) [0x0000a] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.Text.StringBuilder.AppendFormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) [0x00308] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.String.FormatHelper (System.IFormatProvider provider, System.String format, System.ParamsArray args) [0x00023] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.String.Format (System.IFormatProvider provider, System.String format, System.Object arg0) [0x00008] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.IO.TextWriter.WriteLine (System.String format, System.Object arg0) [0x00007] in <55adae4546cd485ba70e2948332ebe8c>:0
at System.IO.TextWriter+SyncTextWriter.WriteLine (System.String format, System.Object arg0) [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
at (wrapper synchronized) System.IO.TextWriter+SyncTextWriter.WriteLine(string,object)
at System.Console.WriteLine (System.String format, System.Object arg0) [0x00000] in <55adae4546cd485ba70e2948332ebe8c>:0
at ExampleApp.PlayerMovement.Start () [0x00007] in <6b3c479fe6974a38b024c98ff963d353>:0
Я изучал это и думаю, что это может быть ошибка связывания.
Что я связали
Как я сказал выше, это отлично работает для нуля в качестве значения переменной, поэтому я думаю, что указанная выше библиотека единственное, что мне нужно связать
Любая помощь будет принята с благодарностью