Split Native Parts to SharedObject and Executable
[platform/core/dotnet/launcher.git] / Tizen.Runtime / Tizen.Runtime / AssemblyLoader.cs
1 using System;
2 using System.IO;
3 using System.Reflection;
4 using System.Runtime.Loader;
5 using System.Collections.Generic;
6
7 namespace Tizen.Runtime
8 {
9     public class AssemblyLoader : AssemblyLoadContext
10     {
11         private SortedSet<string> _dllDirectories = new SortedSet<string>();
12         private SortedSet<string> _nativeDirectories = new SortedSet<string>();
13
14         public IEnumerable<string> DllDirectories
15         {
16             get { return _dllDirectories; }
17         }
18
19         public IEnumerable<string> NativeDirectories
20         {
21             get { return _nativeDirectories; }
22         }
23
24         public void AddSearchableDirectory(string directory)
25         {
26             if (Directory.Exists(directory))
27             {
28                 _dllDirectories.Add(directory);
29                 _nativeDirectories.Add(directory);
30             }
31         }
32
33         public void RemoveSearchableDirectory(string directory)
34         {
35             _dllDirectories.Remove(directory);
36             _nativeDirectories.Remove(directory);
37         }
38
39         protected override Assembly Load(AssemblyName assemblyName)
40         {
41             ALog.Debug($"Load DLL : {assemblyName.Name}");
42             Assembly asm = null;
43
44             try
45             {
46                 asm = Assembly.Load(assemblyName);
47             }
48             catch (Exception ex)
49                 when (ex is FileNotFoundException ||
50                         ex is BadImageFormatException ||
51                         ex is FileLoadException)
52             {
53                 ALog.Debug("Search DLL in added directories");
54                 foreach (string dir in DllDirectories)
55                 {
56                     FileInfo f = new FileInfo(Path.Combine(dir, $"{assemblyName.Name}.dll"));
57                     if (File.Exists(f.FullName))
58                     {
59                         asm = LoadFromAssemblyPath(f.FullName);
60                         break;
61                     }
62                 }
63             }
64             return asm;
65         }
66
67         protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
68         {
69             ALog.Debug($"Load Native : {unmanagedDllName}");
70             IntPtr native = base.LoadUnmanagedDll(unmanagedDllName);
71             if (native == IntPtr.Zero)
72             {
73                 ALog.Debug("Search native lib in added directories");
74                 foreach (string dir in NativeDirectories)
75                 {
76                     FileInfo f = new FileInfo(Path.Combine(dir, unmanagedDllName));
77                     if (File.Exists(f.FullName))
78                     {
79                         native = LoadUnmanagedDllFromPath(f.FullName);
80                         break;
81                     }
82                 }
83             }
84
85             return native;
86         }
87     }
88 }