3 using System.Reflection;
4 using System.Runtime.Loader;
5 using System.Collections.Generic;
7 namespace Tizen.Runtime
9 public class AssemblyLoader : AssemblyLoadContext
11 private SortedSet<string> _dllDirectories = new SortedSet<string>();
12 private SortedSet<string> _nativeDirectories = new SortedSet<string>();
14 public IEnumerable<string> DllDirectories
16 get { return _dllDirectories; }
19 public IEnumerable<string> NativeDirectories
21 get { return _nativeDirectories; }
24 public void AddSearchableDirectory(string directory)
26 if (Directory.Exists(directory))
28 _dllDirectories.Add(directory);
29 _nativeDirectories.Add(directory);
33 public void RemoveSearchableDirectory(string directory)
35 _dllDirectories.Remove(directory);
36 _nativeDirectories.Remove(directory);
39 protected override Assembly Load(AssemblyName assemblyName)
41 ALog.Debug($"Load DLL : {assemblyName.Name}");
46 asm = Assembly.Load(assemblyName);
49 when (ex is FileNotFoundException ||
50 ex is BadImageFormatException ||
51 ex is FileLoadException)
53 ALog.Debug("Search DLL in added directories");
54 foreach (string dir in DllDirectories)
56 FileInfo f = new FileInfo(Path.Combine(dir, $"{assemblyName.Name}.dll"));
57 if (File.Exists(f.FullName))
59 asm = LoadFromAssemblyPath(f.FullName);
67 protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
69 ALog.Debug($"Load Native : {unmanagedDllName}");
70 IntPtr native = base.LoadUnmanagedDll(unmanagedDllName);
71 if (native == IntPtr.Zero)
73 ALog.Debug("Search native lib in added directories");
74 foreach (string dir in NativeDirectories)
76 FileInfo f = new FileInfo(Path.Combine(dir, unmanagedDllName));
77 if (File.Exists(f.FullName))
79 native = LoadUnmanagedDllFromPath(f.FullName);