2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 using System.Reflection;
20 using System.Runtime.Loader;
21 using System.Globalization;
22 using System.Runtime.CompilerServices;
24 namespace Tizen.Runtime
26 public class Preloader
28 const string preloadPath = "/usr/share/dotnet.tizen/preload/";
30 // If current culture's casing for ASCII is the same as invariant, it can take a fast path
31 // than calling out to the OS for culture-aware casing.
32 // However, in certain languages, the following function may be significantly slowed down.
33 // To avoid that kind situation, call it in advance on the candidate process.
34 [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
35 private static void CheckAsciiCasing()
37 _ = CultureInfo.CurrentCulture.CompareInfo.Compare("abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", CompareOptions.IgnoreCase);
38 _ = "abc".ToUpper().ToLower();
41 public static void Preload()
45 if (!Directory.Exists(preloadPath))
48 string[] paths = Directory.GetFiles(preloadPath, "*.preload");
50 foreach (string path in paths)
52 string fileName = Path.GetFileName(path);
54 // GetFileName() can return NULL
58 // ex) Tizen.preload / 0A.Tizen.preload / A0.Tizen.preload / .0.Tizen.preload / .00.Tizen.preload
59 if (!char.IsNumber(fileName, 0) || !char.IsNumber(fileName, 1))
62 // ex) 000.Tizen.preload / 0.Tizen.preload
63 if (fileName.IndexOf('.') != 2)
66 string value = System.Environment.GetEnvironmentVariable("TIZEN_UIFW");
67 // if TIZEN_UIFW is not set, do not preload UI related dll
68 if (value == null && (fileName.Contains("NUI") || fileName.Contains("ElmSharp") || fileName.Contains("XSF") ))
70 else if (value == "ElmSharp" && fileName.Contains("NUI"))
72 else if (value == "NUI" && (fileName.Contains("ElmSharp") || fileName.Contains("XSF")))
77 Console.WriteLine("Start preload : " + fileName);
78 BindingFlags bindingFlag = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
79 foreach (string line in File.ReadLines(path))
81 if (line.StartsWith('#') || !line.Contains(".dll") || !line.Contains(' '))
84 string[] getWord = line.Split(' ');
85 if (getWord.Length != 2)
88 string assemblyStr = getWord[0].Replace(".dll", "");
89 string typenameStr = getWord[1];
90 string methodStr = "";
91 string parenthesis = "()";
93 if (line.Contains(parenthesis))
95 string[] getMethod = typenameStr.Split('.');
96 methodStr = getMethod[getMethod.Length - 1].Replace(parenthesis, "");
97 typenameStr = typenameStr.Replace("." + methodStr + parenthesis, "");
100 if (assemblyStr == "")
102 Console.WriteLine("[Warning] Skip the '" + line + "' in " + fileName);
108 Assembly asm = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(assemblyStr));
111 Console.WriteLine("[Warning] Check the '" + line + "' in " + fileName);
115 if (typenameStr != "" && !typenameStr.Contains(parenthesis))
117 Type type = asm.GetType(typenameStr);
120 Console.WriteLine("[Warning] Check the '" + line + "' in " + fileName);
126 MethodInfo method = type.GetMethod(methodStr, bindingFlag);
129 Console.WriteLine("[Warning] Check the '" + line + "' in " + fileName);
132 method.Invoke(null, null);
138 Console.WriteLine("[Error] Fail the '" + line + "' in " + fileName);
142 catch (IOException e)
144 Console.WriteLine(e.ToString());
145 Console.WriteLine("[Error] Failed to open file : " + fileName);
150 GC.WaitForPendingFinalizers();
152 Profiler.SetCandidateProcessProfile();