diff --git a/netfx_loader/ClrLoader.cs b/netfx_loader/ClrLoader.cs index 2a065bb..472ff4a 100644 --- a/netfx_loader/ClrLoader.cs +++ b/netfx_loader/ClrLoader.cs @@ -3,6 +3,7 @@ using System.IO; using System.Reflection; using System.Runtime.InteropServices; +using System.Text; using NXPorts.Attributes; namespace ClrLoader @@ -12,6 +13,21 @@ public static class ClrLoader static bool _initialized = false; static List _domains = new List(); + private static string PtrToStringUtf8(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + return null; + + int len = 0; + while (Marshal.ReadByte(ptr, len) != 0) + len++; + + byte[] bytes = new byte[len]; + Marshal.Copy(ptr, bytes, 0, len); + + return Encoding.UTF8.GetString(bytes); + } + [DllExport("pyclr_initialize", CallingConvention.Cdecl)] public static void Initialize() { @@ -36,11 +52,10 @@ private static string AssemblyDirectory } [DllExport("pyclr_create_appdomain", CallingConvention.Cdecl)] - public static IntPtr CreateAppDomain( - [MarshalAs(UnmanagedType.LPUTF8Str)] string name, - [MarshalAs(UnmanagedType.LPUTF8Str)] string configFile - ) + public static IntPtr CreateAppDomain(IntPtr namePtr, IntPtr configFilePtr) { + string name = PtrToStringUtf8(namePtr); + string configFile = PtrToStringUtf8(configFilePtr); Print($"Creating AppDomain {name} with {configFile}"); var clrLoaderDir = AssemblyDirectory; @@ -68,13 +83,16 @@ public static IntPtr CreateAppDomain( [DllExport("pyclr_get_function", CallingConvention.Cdecl)] public static IntPtr GetFunction( IntPtr domain, - [MarshalAs(UnmanagedType.LPUTF8Str)] string assemblyPath, - [MarshalAs(UnmanagedType.LPUTF8Str)] string typeName, - [MarshalAs(UnmanagedType.LPUTF8Str)] string function + IntPtr assemblyPathPtr, + IntPtr typeNamePtr, + IntPtr functionPtr ) { try { + string assemblyPath = PtrToStringUtf8(assemblyPathPtr); + string typeName = PtrToStringUtf8(typeNamePtr); + string function = PtrToStringUtf8(functionPtr); var domainData = _domains[(int)domain]; Print($"Getting functor for function {function} of type {typeName} in assembly {assemblyPath}"); return domainData.GetFunctor(assemblyPath, typeName, function); diff --git a/netfx_loader/ClrLoader.csproj b/netfx_loader/ClrLoader.csproj index 42f5ef8..e1283f1 100644 --- a/netfx_loader/ClrLoader.csproj +++ b/netfx_loader/ClrLoader.csproj @@ -1,6 +1,6 @@ - + - net472 + net461 win-x86;win-x64 diff --git a/netfx_loader/DomainData.cs b/netfx_loader/DomainData.cs index 35c3363..24adeb9 100644 --- a/netfx_loader/DomainData.cs +++ b/netfx_loader/DomainData.cs @@ -38,13 +38,13 @@ class DomainData : IDisposable bool _disposed = false; public AppDomain Domain { get; } - public Dictionary<(string, string, string), IntPtr> _functors; + public Dictionary, IntPtr> _functors; public HashSet _resolvedAssemblies; public DomainData(AppDomain domain) { Domain = domain; - _functors = new Dictionary<(string, string, string), IntPtr>(); + _functors = new Dictionary, IntPtr>(); _resolvedAssemblies = new HashSet(); } @@ -76,7 +76,7 @@ public IntPtr GetFunctor(string assemblyPath, string typeName, string function) installResolver(assemblyPath); var assemblyName = AssemblyName.GetAssemblyName(assemblyPath).Name; - var key = (assemblyName, typeName, function); + var key = Tuple.Create(assemblyName, typeName, function); IntPtr result; if (!_functors.TryGetValue(key, out result))