Skip to content

Commit 1f68005

Browse files
authored
Target net461 (#114)
1 parent e14cebd commit 1f68005

3 files changed

Lines changed: 30 additions & 12 deletions

File tree

netfx_loader/ClrLoader.cs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.IO;
44
using System.Reflection;
55
using System.Runtime.InteropServices;
6+
using System.Text;
67
using NXPorts.Attributes;
78

89
namespace ClrLoader
@@ -12,6 +13,21 @@ public static class ClrLoader
1213
static bool _initialized = false;
1314
static List<DomainData> _domains = new List<DomainData>();
1415

16+
private static string PtrToStringUtf8(IntPtr ptr)
17+
{
18+
if (ptr == IntPtr.Zero)
19+
return null;
20+
21+
int len = 0;
22+
while (Marshal.ReadByte(ptr, len) != 0)
23+
len++;
24+
25+
byte[] bytes = new byte[len];
26+
Marshal.Copy(ptr, bytes, 0, len);
27+
28+
return Encoding.UTF8.GetString(bytes);
29+
}
30+
1531
[DllExport("pyclr_initialize", CallingConvention.Cdecl)]
1632
public static void Initialize()
1733
{
@@ -36,11 +52,10 @@ private static string AssemblyDirectory
3652
}
3753

3854
[DllExport("pyclr_create_appdomain", CallingConvention.Cdecl)]
39-
public static IntPtr CreateAppDomain(
40-
[MarshalAs(UnmanagedType.LPUTF8Str)] string name,
41-
[MarshalAs(UnmanagedType.LPUTF8Str)] string configFile
42-
)
55+
public static IntPtr CreateAppDomain(IntPtr namePtr, IntPtr configFilePtr)
4356
{
57+
string name = PtrToStringUtf8(namePtr);
58+
string configFile = PtrToStringUtf8(configFilePtr);
4459
Print($"Creating AppDomain {name} with {configFile}");
4560

4661
var clrLoaderDir = AssemblyDirectory;
@@ -68,13 +83,16 @@ public static IntPtr CreateAppDomain(
6883
[DllExport("pyclr_get_function", CallingConvention.Cdecl)]
6984
public static IntPtr GetFunction(
7085
IntPtr domain,
71-
[MarshalAs(UnmanagedType.LPUTF8Str)] string assemblyPath,
72-
[MarshalAs(UnmanagedType.LPUTF8Str)] string typeName,
73-
[MarshalAs(UnmanagedType.LPUTF8Str)] string function
86+
IntPtr assemblyPathPtr,
87+
IntPtr typeNamePtr,
88+
IntPtr functionPtr
7489
)
7590
{
7691
try
7792
{
93+
string assemblyPath = PtrToStringUtf8(assemblyPathPtr);
94+
string typeName = PtrToStringUtf8(typeNamePtr);
95+
string function = PtrToStringUtf8(functionPtr);
7896
var domainData = _domains[(int)domain];
7997
Print($"Getting functor for function {function} of type {typeName} in assembly {assemblyPath}");
8098
return domainData.GetFunctor(assemblyPath, typeName, function);

netfx_loader/ClrLoader.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<TargetFrameworks>net472</TargetFrameworks>
3+
<TargetFrameworks>net461</TargetFrameworks>
44
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
55
</PropertyGroup>
66

netfx_loader/DomainData.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ class DomainData : IDisposable
3838
bool _disposed = false;
3939

4040
public AppDomain Domain { get; }
41-
public Dictionary<(string, string, string), IntPtr> _functors;
41+
public Dictionary<Tuple<string, string, string>, IntPtr> _functors;
4242
public HashSet<string> _resolvedAssemblies;
4343

4444
public DomainData(AppDomain domain)
4545
{
4646
Domain = domain;
47-
_functors = new Dictionary<(string, string, string), IntPtr>();
47+
_functors = new Dictionary<Tuple<string, string, string>, IntPtr>();
4848
_resolvedAssemblies = new HashSet<string>();
4949
}
5050

@@ -76,7 +76,7 @@ public IntPtr GetFunctor(string assemblyPath, string typeName, string function)
7676
installResolver(assemblyPath);
7777
var assemblyName = AssemblyName.GetAssemblyName(assemblyPath).Name;
7878

79-
var key = (assemblyName, typeName, function);
79+
var key = Tuple.Create(assemblyName, typeName, function);
8080

8181
IntPtr result;
8282
if (!_functors.TryGetValue(key, out result))

0 commit comments

Comments
 (0)