Skip to content

Commit 4c35802

Browse files
C-SELLERSfilmor
andauthored
Mono Domain Set Config (#9)
* set config for mono, dummy if none given * Encode config_file string * byte literall string for config location * Use config parameter for domain config * Allow the global config path to be set * Fix mono_config_parse call Co-authored-by: Benedikt Reinartz <[email protected]>
1 parent e90553b commit 4c35802

File tree

3 files changed

+37
-8
lines changed

3 files changed

+37
-8
lines changed

clr_loader/__init__.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
def get_mono(
1010
domain: Optional[str] = None,
1111
config_file: Optional[str] = None,
12+
global_config_file: Optional[str] = None,
1213
libmono: Optional[str] = None,
1314
sgen: bool = True,
1415
) -> Runtime:
@@ -17,7 +18,12 @@ def get_mono(
1718
if libmono is None:
1819
libmono = find_libmono(sgen)
1920

20-
impl = Mono(domain=domain, config_file=config_file, libmono=libmono)
21+
impl = Mono(
22+
domain=domain,
23+
config_file=config_file,
24+
global_config_file=global_config_file,
25+
libmono=libmono,
26+
)
2127
return Runtime(impl)
2228

2329

clr_loader/ffi/mono.py

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
MonoAssembly* mono_domain_assembly_open(MonoDomain *domain, const char *name);
1717
MonoImage* mono_assembly_get_image(MonoAssembly *assembly);
1818
19+
void mono_domain_set_config(MonoDomain *domain, const char *base_dir, const char *config_file_name);
1920
void mono_config_parse(const char* path);
2021
2122
MonoMethodDesc* mono_method_desc_new(const char* name, bool include_namespace);

clr_loader/mono.py

+29-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import atexit
2+
from typing import Optional
23

34
from .ffi import load_mono, ffi
45

@@ -11,10 +12,21 @@
1112

1213

1314
class Mono:
14-
def __init__(self, libmono, domain=None, config_file=None):
15+
def __init__(
16+
self,
17+
libmono,
18+
*,
19+
domain=None,
20+
config_file: Optional[str] = None,
21+
global_config_file: Optional[str] = None,
22+
):
1523
self._assemblies = {}
1624

17-
initialize(config_file=config_file, libmono=libmono)
25+
initialize(
26+
config_file=config_file,
27+
global_config_file=global_config_file,
28+
libmono=libmono,
29+
)
1830

1931
if domain is None:
2032
self._domain = _ROOT_DOMAIN
@@ -81,18 +93,28 @@ def __call__(self, ptr, size):
8193
return unboxed[0]
8294

8395

84-
def initialize(config_file: str, libmono: str) -> None:
96+
def initialize(
97+
libmono: str,
98+
config_file: Optional[str] = None,
99+
global_config_file: Optional[str] = None,
100+
) -> None:
85101
global _MONO, _ROOT_DOMAIN
86102
if _MONO is None:
87103
_MONO = load_mono(libmono)
88104

105+
# Load in global config (i.e /etc/mono/config)
106+
global_encoded = global_config_file or ffi.NULL
107+
_MONO.mono_config_parse(global_encoded)
108+
109+
# Even if we don't have a domain config file, we still need to set it
110+
# as something, see https://github.com/pythonnet/clr-loader/issues/8
89111
if config_file is None:
90-
config_bytes = ffi.NULL
91-
else:
92-
config_bytes = config_file.encode("utf8")
112+
config_file = ""
113+
114+
config_encoded = config_file.encode("utf8")
93115

94116
_ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader")
95-
_MONO.mono_config_parse(config_bytes)
117+
_MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_encoded)
96118
_check_result(_ROOT_DOMAIN, "Failed to initialize Mono")
97119
atexit.register(_release)
98120

0 commit comments

Comments
 (0)