From 4c358022213344aaf4972382d46dfafb4a23fa1e Mon Sep 17 00:00:00 2001 From: Colton Sellers <41277998+C-SELLERS@users.noreply.github.com> Date: Wed, 17 Mar 2021 22:00:11 -0700 Subject: [PATCH 1/2] 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 --- clr_loader/__init__.py | 8 +++++++- clr_loader/ffi/mono.py | 1 + clr_loader/mono.py | 36 +++++++++++++++++++++++++++++------- 3 files changed, 37 insertions(+), 8 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/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..10e422f 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,18 +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_encoded = global_config_file or ffi.NULL + _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 if config_file is None: - config_bytes = ffi.NULL - else: - config_bytes = config_file.encode("utf8") + config_file = "" + + config_encoded = 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, b".", config_encoded) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") atexit.register(_release) From e951b92487c1e9f96c5efed8c243144d63173628 Mon Sep 17 00:00:00 2001 From: Benedikt Reinartz Date: Sun, 4 Apr 2021 23:16:57 +0200 Subject: [PATCH 2/2] Bump version to 0.1.6 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 27083cd..f56465c 100755 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ def finalize_options(self): setup( name="clr_loader", - version="0.1.5", + version="0.1.6", description="Generic pure Python loader for .NET runtimes", author="Benedikt Reinartz", author_email="filmor@gmail.com",