|
1 | 1 | import atexit
|
| 2 | +from typing import Optional |
2 | 3 |
|
3 | 4 | from .ffi import load_mono, ffi
|
4 | 5 |
|
|
11 | 12 |
|
12 | 13 |
|
13 | 14 | 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 | + ): |
15 | 23 | self._assemblies = {}
|
16 | 24 |
|
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 | + ) |
18 | 30 |
|
19 | 31 | if domain is None:
|
20 | 32 | self._domain = _ROOT_DOMAIN
|
@@ -81,18 +93,28 @@ def __call__(self, ptr, size):
|
81 | 93 | return unboxed[0]
|
82 | 94 |
|
83 | 95 |
|
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: |
85 | 101 | global _MONO, _ROOT_DOMAIN
|
86 | 102 | if _MONO is None:
|
87 | 103 | _MONO = load_mono(libmono)
|
88 | 104 |
|
| 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 |
89 | 111 | 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") |
93 | 115 |
|
94 | 116 | _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) |
96 | 118 | _check_result(_ROOT_DOMAIN, "Failed to initialize Mono")
|
97 | 119 | atexit.register(_release)
|
98 | 120 |
|
|
0 commit comments