Arcane  4.1.12.0
Developer documentation
Loading...
Searching...
No Matches
ArcaneMono.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
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>
11#include <stdlib.h>
12#include <string.h>
13
14#include <iostream>
15
16#include "arcane/utils/PlatformUtils.h"
17#include "arcane/utils/String.h"
18#include "arcane/utils/CommandLineArguments.h"
19
21#include "arcane/core/ObserverPool.h"
22
23namespace
24{
25bool dotnet_verbose = false;
26bool global_is_running = false;
27} // namespace
28
29/*---------------------------------------------------------------------------*/
30/*---------------------------------------------------------------------------*/
32
33extern "C" int mono_main(int argc, char* argv[]);
34
35/*---------------------------------------------------------------------------*/
36/*---------------------------------------------------------------------------*/
37
39{
40 public:
41
42 void init()
43 {
44 m_observers.addObserver(this, &ArcaneMonoThreadAttachCallback::_callback,
46 }
47
48 private:
49
50 void _callback()
51 {
52#ifndef ARCANE_MONO_NO_THREAD_ATTACH
53 if (dotnet_verbose)
54 std::cout << "MONO_THREAD_ATTACH CALLBACK !\n";
55 mono_thread_attach(mono_get_root_domain());
56#endif
57 }
58
59 private:
60
61 Arcane::ObserverPool m_observers;
62};
63
64/*---------------------------------------------------------------------------*/
65/*---------------------------------------------------------------------------*/
66
67int _arcane_mono_main_internal(int argc, char* argv[], const char* assembly_name)
68{
69 if (global_is_running)
70 ARCANE_FATAL("mono wrapper has already been launched");
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);
78 Arcane::String verbose_str = Arcane::platform::getEnvironmentVariable("ARCANE_DEBUG_DOTNET");
79 dotnet_verbose = !verbose_str.null();
80
81 if (dotnet_verbose) {
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';
85 std::cout.flush();
86 }
87
89 mtac.init();
90
91 int retval = mono_main(new_argc, new_argv);
92 global_is_running = false;
93 return retval;
94}
95
96/*---------------------------------------------------------------------------*/
97/*---------------------------------------------------------------------------*/
98
99// Obsolete: use 'arcane_mono_main2' instead.
100extern "C" ARCANE_EXPORT int
101arcane_mono_main(int argc, char* argv[], const char* assembly_name)
102{
103 if (!assembly_name || assembly_name[0] == '\0')
104 assembly_name = "Arcane.Main.dll";
105 return _arcane_mono_main_internal(argc, argv, assembly_name);
106}
107
108/*---------------------------------------------------------------------------*/
109/*---------------------------------------------------------------------------*/
110
111extern "C" ARCANE_EXPORT int
112arcane_mono_main2(const Arcane::CommandLineArguments& cmd_args,
113 const Arcane::String& orig_assembly_name)
114{
115 Arcane::String assembly_name = orig_assembly_name;
116 if (assembly_name.empty())
117 assembly_name = "Arcane.Main.dll";
118
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);
123}
124
125/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
127
128void arcane_mono_launch()
129{
130}
131
132/*---------------------------------------------------------------------------*/
133/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro throwing a FatalErrorException.
Classes, Types, and macros for managing concurrency.
List of observers.
bool null() const
Returns true if the string is null.
Definition String.cc:306
const char * localstr() const
Returns the conversion of the instance into UTF-8 encoding.
Definition String.cc:229
bool empty() const
True if the string is empty (null or "").
Definition String.cc:317
static IObservable * createThreadObservable()
Observable called when a thread is created for a task.
String getEnvironmentVariable(const String &name)
Environment variable named name.