summaryrefslogtreecommitdiff
path: root/Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs')
-rwxr-xr-xTizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs89
1 files changed, 63 insertions, 26 deletions
diff --git a/Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs b/Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs
index cbb0095..35a8ddf 100755
--- a/Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs
+++ b/Tizen.Runtime/Tizen.Runtime.Coreclr/AssemblyLoader.cs
@@ -16,6 +16,7 @@
using System;
using System.IO;
+using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using System.Collections.Generic;
@@ -24,9 +25,24 @@ namespace Tizen.Runtime.Coreclr
{
public class AssemblyLoader : AssemblyLoadContext
{
+ private const string NativeAssemblyInfix = ".ni";
+
+ private const string DllAssemblySuffix = ".dll";
+
+ private const string NativeDllAssemblySuffix = NativeAssemblyInfix + DllAssemblySuffix;
+
+ private static readonly string[] s_suffixes = new string[] { NativeDllAssemblySuffix, DllAssemblySuffix };
+
private SortedSet<string> _dllDirectories = new SortedSet<string>();
private SortedSet<string> _nativeDirectories = new SortedSet<string>();
+ private HashSet<FileInfo> _dllCache = new HashSet<FileInfo>();
+
+ public AssemblyLoader()
+ {
+ AssemblyLoadContext.Default.Resolving += OnResolving;
+ }
+
public IEnumerable<string> DllDirectories
{
get { return _dllDirectories; }
@@ -43,6 +59,16 @@ namespace Tizen.Runtime.Coreclr
{
_dllDirectories.Add(directory);
_nativeDirectories.Add(directory);
+
+ foreach (var file in Directory.GetFiles(directory))
+ {
+ var info = new FileInfo(file);
+
+ if (info.Extension == DllAssemblySuffix)
+ {
+ _dllCache.Add(info);
+ }
+ }
}
}
@@ -50,39 +76,30 @@ namespace Tizen.Runtime.Coreclr
{
_dllDirectories.Remove(directory);
_nativeDirectories.Remove(directory);
+
+ _dllCache.RemoveWhere(x => x.DirectoryName == directory);
}
- protected override Assembly Load(AssemblyName assemblyName)
+ public Assembly LoadFromPath(string path)
{
- Assembly asm = null;
-
- try
+ if (0 == string.Compare(path, // strA
+ path.Length - NativeDllAssemblySuffix.Length, // indexA
+ NativeAssemblyInfix, // strB
+ 0, // indexB
+ NativeAssemblyInfix.Length, // length
+ StringComparison.OrdinalIgnoreCase)) // options
{
- //asm = AssemblyLoadContext.Default.Load(assemblyName);
- asm = AssemblyLoadContext.Default.LoadFromAssemblyName(assemblyName);
+ return LoadFromNativeImagePath(path, null);
}
- catch (Exception ex)
- when (ex is FileNotFoundException ||
- ex is BadImageFormatException ||
- ex is FileLoadException)
+ else
{
- foreach (string dir in DllDirectories)
- {
- FileInfo f = new FileInfo(Path.Combine(dir, $"{assemblyName.Name}.ni.dll"));
- if (File.Exists(f.FullName))
- {
- asm = LoadFromNativeImagePath(f.FullName, null);
- break;
- }
- f = new FileInfo(Path.Combine(dir, $"{assemblyName.Name}.dll"));
- if (File.Exists(f.FullName))
- {
- asm = LoadFromAssemblyPath(f.FullName);
- break;
- }
- }
+ return LoadFromAssemblyPath(path);
}
- return asm;
+ }
+
+ protected override Assembly Load(AssemblyName assemblyName)
+ {
+ return Resolve(assemblyName);
}
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
@@ -103,5 +120,25 @@ namespace Tizen.Runtime.Coreclr
return native;
}
+
+ private Assembly Resolve(AssemblyName assemblyName)
+ {
+ foreach (string suffix in s_suffixes)
+ {
+ var info = _dllCache.FirstOrDefault(x => x.Name == assemblyName.Name + suffix);
+
+ if (info != null)
+ {
+ return LoadFromPath(info.FullName);
+ }
+ }
+
+ return null;
+ }
+
+ private Assembly OnResolving(AssemblyLoadContext context, AssemblyName assemblyName)
+ {
+ return Resolve(assemblyName);
+ }
}
}