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/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 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", 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