7#include <mono/jit/jit.h>
8#include <mono/metadata/environment.h>
9#include <mono/metadata/mono-config.h>
10#include <mono/metadata/threads.h>
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/String.h"
18#include "arcane/utils/CommandLineArguments.h"
21#include "arcane/core/ObserverPool.h"
25bool dotnet_verbose =
false;
26bool global_is_running =
false;
33extern "C" int mono_main(
int argc,
char* argv[]);
44 m_observers.addObserver(
this, &ArcaneMonoThreadAttachCallback::_callback,
52#ifndef ARCANE_MONO_NO_THREAD_ATTACH
54 std::cout <<
"MONO_THREAD_ATTACH CALLBACK !\n";
55 mono_thread_attach(mono_get_root_domain());
67int _arcane_mono_main_internal(
int argc,
char* argv[],
const char* assembly_name)
69 if (global_is_running)
71 global_is_running =
true;
72 int new_argc = argc + 1;
73 char** new_argv =
new char*[new_argc + 1];
74 new_argv[0] = strdup(argv[0]);
75 for (
int i = 1; i < argc; ++i)
76 new_argv[i + 1] = argv[i];
77 new_argv[1] = strdup(assembly_name);
79 dotnet_verbose = !verbose_str.
null();
82 std::cout <<
"ArcaneMono: ASSEMBLY NAME is '" << assembly_name <<
"' argc=" << argc <<
"\n";
83 for (
int i = 0; i < new_argc; ++i)
84 std::cout <<
"ArcaneMono: Arg i=" << i <<
" V=" << new_argv[i] <<
'\n';
91 int retval = mono_main(new_argc, new_argv);
92 global_is_running =
false;
100extern "C" ARCANE_EXPORT
int
101arcane_mono_main(
int argc,
char* argv[],
const char* assembly_name)
103 if (!assembly_name || assembly_name[0] ==
'\0')
104 assembly_name =
"Arcane.Main.dll";
105 return _arcane_mono_main_internal(argc, argv, assembly_name);
111extern "C" ARCANE_EXPORT
int
116 if (assembly_name.
empty())
117 assembly_name =
"Arcane.Main.dll";
119 int argc = *(cmd_args.commandLineArgc());
120 char** argv = *(cmd_args.commandLineArgv());
121 const char* assembly_name_str = assembly_name.
localstr();
122 return _arcane_mono_main_internal(argc, argv, assembly_name_str);
128void arcane_mono_launch()
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Classes, Types, and macros for managing concurrency.
Unicode character string.
bool null() const
Returns true if the string is null.
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
bool empty() const
True if the string is empty (null or "").
static IObservable * createThreadObservable()
Observable called when a thread is created for a task.