Встраивание моно в MacOS не может печатать поплавки - PullRequest
0 голосов
/ 13 июля 2020

Я встраивал моно в приложение 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 

Я изучал это и думаю, что это может быть ошибка связывания.

Что я связали

  • libmonosgen-2.0.a

Как я сказал выше, это отлично работает для нуля в качестве значения переменной, поэтому я думаю, что указанная выше библиотека единственное, что мне нужно связать

Любая помощь будет принята с благодарностью

...