From c8ca462bdbcff85d32420fcaadfe20cacefdde17 Mon Sep 17 00:00:00 2001 From: Vince <87706793+DareDevilDenis@users.noreply.github.com> Date: Wed, 10 Nov 2021 19:17:54 +0000 Subject: [PATCH 1/3] Fix issue 14 for 32 bit Windows (#15) Co-authored-by: LUFF,VINCE (K-UnitedKingdom,ex1) --- clr_loader/util/find.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/clr_loader/util/find.py b/clr_loader/util/find.py index f33b0c2..a38600e 100644 --- a/clr_loader/util/find.py +++ b/clr_loader/util/find.py @@ -11,11 +11,7 @@ def find_dotnet_root() -> str: if sys.platform == "win32": # On Windows, the host library is stored separately from dotnet.exe for x86 - if sys.maxsize > 2 ** 32: - prog_files = os.environ.get("ProgramFiles") - else: - prog_files = os.environ.get("ProgramFiles(x86)") - + prog_files = os.environ.get("ProgramFiles") dotnet_root = os.path.join(prog_files, "dotnet") if os.path.isdir(dotnet_root): return dotnet_root From 699c6d640e41404bb1cb008f811809aa18b3fb6c Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 16 Nov 2021 13:58:01 -0800 Subject: [PATCH 2/3] Allow mono debugging and jit flags (#16) --- .vscode/launch.json | 12 ++++++++++++ clr_loader/__init__.py | 6 +++++- clr_loader/ffi/mono.py | 11 +++++++++++ clr_loader/mono.py | 15 ++++++++++++++- tests/test_common.py | 14 ++++++++++++++ 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2ac8f31 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach", + "type": "mono", + "request": "attach", + "address": "localhost", + "port": 5831 + } + ] +} \ No newline at end of file diff --git a/clr_loader/__init__.py b/clr_loader/__init__.py index aa4c7a9..779b514 100644 --- a/clr_loader/__init__.py +++ b/clr_loader/__init__.py @@ -1,4 +1,4 @@ -from typing import Dict, Optional +from typing import Dict, Optional, Sequence from .wrappers import Runtime from .util.find import find_libmono, find_dotnet_root @@ -12,6 +12,8 @@ def get_mono( global_config_file: Optional[str] = None, libmono: Optional[str] = None, sgen: bool = True, + debug: bool = False, + jit_options: Optional[Sequence[str]] = None, ) -> Runtime: from .mono import Mono @@ -20,6 +22,8 @@ def get_mono( impl = Mono( domain=domain, + debug=debug, + jit_options=jit_options, config_file=config_file, global_config_file=global_config_file, libmono=libmono, diff --git a/clr_loader/ffi/mono.py b/clr_loader/ffi/mono.py index 427360c..25a855a 100644 --- a/clr_loader/ffi/mono.py +++ b/clr_loader/ffi/mono.py @@ -11,8 +11,19 @@ typedef struct _MonoMethod MonoMethod; typedef struct _MonoObject MonoObject; +typedef enum { + MONO_DEBUG_FORMAT_NONE, + MONO_DEBUG_FORMAT_MONO, + /* Deprecated, the mdb debugger is not longer supported. */ + MONO_DEBUG_FORMAT_DEBUGGER +} MonoDebugFormat; + MonoDomain* mono_jit_init(const char *root_domain_name); void mono_jit_cleanup(MonoDomain *domain); +void mono_jit_parse_options(int argc, char * argv[]); + +void mono_debug_init (MonoDebugFormat format); + MonoAssembly* mono_domain_assembly_open(MonoDomain *domain, const char *name); MonoImage* mono_assembly_get_image(MonoAssembly *assembly); diff --git a/clr_loader/mono.py b/clr_loader/mono.py index 10e422f..e4fcb44 100644 --- a/clr_loader/mono.py +++ b/clr_loader/mono.py @@ -1,5 +1,5 @@ import atexit -from typing import Optional +from typing import Optional, Sequence from .ffi import load_mono, ffi @@ -17,6 +17,8 @@ def __init__( libmono, *, domain=None, + debug=False, + jit_options: Optional[Sequence[str]] = None, config_file: Optional[str] = None, global_config_file: Optional[str] = None, ): @@ -24,6 +26,8 @@ def __init__( initialize( config_file=config_file, + debug=debug, + jit_options=jit_options, global_config_file=global_config_file, libmono=libmono, ) @@ -95,6 +99,8 @@ def __call__(self, ptr, size): def initialize( libmono: str, + debug: bool = False, + jit_options: Optional[Sequence[str]] = None, config_file: Optional[str] = None, global_config_file: Optional[str] = None, ) -> None: @@ -113,6 +119,13 @@ def initialize( config_encoded = config_file.encode("utf8") + if jit_options: + options = [ffi.new("char[]", o.encode("utf8")) for o in jit_options] + _MONO.mono_jit_parse_options(len(options), options) + + if debug: + _MONO.mono_debug_init(_MONO.MONO_DEBUG_FORMAT_MONO) + _ROOT_DOMAIN = _MONO.mono_jit_init(b"clr_loader") _MONO.mono_domain_set_config(_ROOT_DOMAIN, b".", config_encoded) _check_result(_ROOT_DOMAIN, "Failed to initialize Mono") diff --git a/tests/test_common.py b/tests/test_common.py index 0a6e177..04fec64 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -32,6 +32,20 @@ def test_mono(example_netstandard): run_tests(asm) +def test_mono_debug(example_netstandard): + from clr_loader import get_mono + + mono = get_mono( + debug=True, + jit_options=[ + "--debugger-agent=address=0.0.0.0:5831,transport=dt_socket,server=y" + ], + ) + asm = mono.get_assembly(os.path.join(example_netstandard, "example.dll")) + + run_tests(asm) + + def test_coreclr(example_netcore): from clr_loader import get_coreclr From c282eadea8c118d7853231d5c75f972f4aabc62f Mon Sep 17 00:00:00 2001 From: Victor Date: Fri, 19 Nov 2021 04:15:58 -0800 Subject: [PATCH 3/3] Bump version to 0.1.7 (#17) --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f56465c..efd98bc 100755 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ def finalize_options(self): setup( name="clr_loader", - version="0.1.6", + version="0.1.7", description="Generic pure Python loader for .NET runtimes", author="Benedikt Reinartz", author_email="filmor@gmail.com",