From ada9c81eac4f15b4db0f4cfb5c6487364b6daacc Mon Sep 17 00:00:00 2001 From: Colton Sellers Date: Wed, 10 Mar 2021 11:47:09 -0800 Subject: [PATCH 1/6] set config for mono, dummy if none given --- clr_loader/ffi/mono.py | 1 + clr_loader/mono.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/clr_loader/ffi/mono.py b/clr_loader/ffi/mono.py index e2e6cc5..427360c 100644 --- a/clr_loader/ffi/mono.py +++ b/clr_loader/ffi/mono.py @@ -16,6 +16,7 @@ MonoAssembly* mono_domain_assembly_open(MonoDomain *domain, const char *name); MonoImage* mono_assembly_get_image(MonoAssembly *assembly); +void mono_domain_set_config(MonoDomain *domain, const char *base_dir, const char *config_file_name); void mono_config_parse(const char* path); MonoMethodDesc* mono_method_desc_new(const char* name, bool include_namespace); diff --git a/clr_loader/mono.py b/clr_loader/mono.py index d3991f7..b75522b 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -87,12 +87,14 @@ def initialize(config_file: str, libmono: str) -> None: _MONO = load_mono(libmono) if config_file is None: + config_file = "dummyConfig" config_bytes = ffi.NULL else: config_bytes = config_file.encode("utf8") _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") _MONO.mono_config_parse(config_bytes) + _MONO.mono_domain_set_config(_ROOT_DOMAIN, ".", config_file) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From 10ea4449865992f0cbbc5083e0508aaea0ac4b5e Mon Sep 17 00:00:00 2001 From: Colton Sellers Date: Wed, 10 Mar 2021 12:46:20 -0800 Subject: [PATCH 2/6] Encode config_file string --- clr_loader/mono.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clr_loader/mono.py b/clr_loader/mono.py index b75522b..66d9587 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -94,7 +94,7 @@ def initialize(config_file: str, libmono: str) -> None: _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") _MONO.mono_config_parse(config_bytes) - _MONO.mono_domain_set_config(_ROOT_DOMAIN, ".", config_file) + _MONO.mono_domain_set_config(_ROOT_DOMAIN, ".", config_file.encode("utf8")) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From c80ac6a7428a9b28c9d9b7035cb76b9cd3268200 Mon Sep 17 00:00:00 2001 From: Colton Sellers Date: Wed, 10 Mar 2021 12:48:55 -0800 Subject: [PATCH 3/6] byte literall string for config location --- clr_loader/mono.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clr_loader/mono.py b/clr_loader/mono.py index 66d9587..fa7badd 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -94,7 +94,7 @@ def initialize(config_file: str, libmono: str) -> None: _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") _MONO.mono_config_parse(config_bytes) - _MONO.mono_domain_set_config(_ROOT_DOMAIN, ".", config_file.encode("utf8")) + _MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_file.encode("utf8")) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From 1fc4c0e5b4b9a336e1eca831411495935df6423b Mon Sep 17 00:00:00 2001 From: Colton Sellers Date: Sat, 13 Mar 2021 14:11:47 -0800 Subject: [PATCH 4/6] Use config parameter for domain config --- clr_loader/mono.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/clr_loader/mono.py b/clr_loader/mono.py index fa7badd..50be020 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -86,14 +86,16 @@ def initialize(config_file: str, libmono: str) -> None: if _MONO is None: _MONO = load_mono(libmono) + # Load in global config (i.e /etc/mono/config) + global_config_file = ffi.NULL + _MONO.mono_config_parse(global_config_file) + + # Even if we don't have a domain config file, we still need to set it as something + # https://github.com/pythonnet/clr-loader/issues/8 if config_file is None: - config_file = "dummyConfig" - config_bytes = ffi.NULL - else: - config_bytes = config_file.encode("utf8") + config_file = "substitute" _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") - _MONO.mono_config_parse(config_bytes) _MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_file.encode("utf8")) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From f3b58c30154acdf5a2c8261099093d64f136b6d2 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Wed, 17 Mar 2021 22:32:23 +0100 Subject: [PATCH 5/6] Allow the global config path to be set --- clr_loader/__init__.py | 8 +++++++- clr_loader/mono.py | 34 ++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/clr_loader/__init__.py b/clr_loader/__init__.py index e8de6be..aa4c7a9 100644 --- a/clr_loader/__init__.py +++ b/clr_loader/__init__.py @@ -9,6 +9,7 @@ def get_mono( domain: Optional[str] = None, config_file: Optional[str] = None, + global_config_file: Optional[str] = None, libmono: Optional[str] = None, sgen: bool = True, ) -> Runtime: @@ -17,7 +18,12 @@ def get_mono( if libmono is None: libmono = find_libmono(sgen) - impl = Mono(domain=domain, config_file=config_file, libmono=libmono) + impl = Mono( + domain=domain, + config_file=config_file, + global_config_file=global_config_file, + libmono=libmono, + ) return Runtime(impl) diff --git a/clr_loader/mono.py b/clr_loader/mono.py index 50be020..59dca43 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -1,4 +1,5 @@ import atexit +from typing import Optional from .ffi import load_mono, ffi @@ -11,10 +12,21 @@ class Mono: - def __init__(self, libmono, domain=None, config_file=None): + def __init__( + self, + libmono, + *, + domain=None, + config_file: Optional[str] = None, + global_config_file: Optional[str] = None, + ): self._assemblies = {} - initialize(config_file=config_file, libmono=libmono) + initialize( + config_file=config_file, + global_config_file=global_config_file, + libmono=libmono, + ) if domain is None: self._domain = _ROOT_DOMAIN @@ -81,22 +93,28 @@ def __call__(self, ptr, size): return unboxed[0] -def initialize(config_file: str, libmono: str) -> None: +def initialize( + libmono: str, + config_file: Optional[str] = None, + global_config_file: Optional[str] = None, +) -> None: global _MONO, _ROOT_DOMAIN if _MONO is None: _MONO = load_mono(libmono) # Load in global config (i.e /etc/mono/config) - global_config_file = ffi.NULL + global_encoded = global_config_file or ffi.NULL _MONO.mono_config_parse(global_config_file) - # Even if we don't have a domain config file, we still need to set it as something - # https://github.com/pythonnet/clr-loader/issues/8 + # Even if we don't have a domain config file, we still need to set it + # as something, see https://github.com/pythonnet/clr-loader/issues/8 if config_file is None: - config_file = "substitute" + config_file = "" + + config_encoded = config_file.encode("utf8") _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") - _MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_file.encode("utf8")) + _MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_encoded) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From 8031c6ec180e6d7e93a403264188b8d6ec006baa Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Wed, 17 Mar 2021 22:36:07 +0100 Subject: [PATCH 6/6] Fix mono_config_parse call --- clr_loader/mono.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clr_loader/mono.py b/clr_loader/mono.py index 59dca43..10e422f 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -104,7 +104,7 @@ def initialize( # Load in global config (i.e /etc/mono/config) global_encoded = global_config_file or ffi.NULL - _MONO.mono_config_parse(global_config_file) + _MONO.mono_config_parse(global_encoded) # Even if we don't have a domain config file, we still need to set it # as something, see https://github.com/pythonnet/clr-loader/issues/8