Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions netfx_loader/ClrLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using NXPorts.Attributes;

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

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()
{
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions netfx_loader/ClrLoader.csproj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net472</TargetFrameworks>
<TargetFrameworks>net461</TargetFrameworks>
<RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
</PropertyGroup>

Expand Down
6 changes: 3 additions & 3 deletions netfx_loader/DomainData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ class DomainData : IDisposable
bool _disposed = false;

public AppDomain Domain { get; }
public Dictionary<(string, string, string), IntPtr> _functors;
public Dictionary<Tuple<string, string, string>, IntPtr> _functors;
public HashSet<string> _resolvedAssemblies;

public DomainData(AppDomain domain)
{
Domain = domain;
_functors = new Dictionary<(string, string, string), IntPtr>();
_functors = new Dictionary<Tuple<string, string, string>, IntPtr>();
_resolvedAssemblies = new HashSet<string>();
}

Expand Down Expand Up @@ -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))
Expand Down
Loading