public void CollectReferences(string path, bool withMethods, float progressValue, bool ignoreSystemDlls) { this.assemblyDefinitions = new HashSet <AssemblyDefinition>(); string[] array = (!Directory.Exists(path)) ? new string[0] : Directory.GetFiles(path); string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string text = array2[i]; if (!(Path.GetExtension(text) != ".dll")) { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(text); if (!ignoreSystemDlls || !this.IsiPhoneIgnoredSystemDll(assemblyDefinition.Name.Name)) { this.assemblyFileNames.Add(Path.GetFileName(text)); this.assemblyDefinitions.Add(assemblyDefinition); } } } AssemblyDefinition[] array3 = this.assemblyDefinitions.ToArray <AssemblyDefinition>(); this.referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(array3); if (withMethods) { this.CollectReferencedMethods(array3, this.referencedMethods, this.definedMethods, progressValue); } }
public void CollectReferences(string path, bool collectMethods, float progressValue, bool ignoreSystemDlls) { this._progressValue = progressValue; this._assemblyDefinitions = new HashSet <AssemblyDefinition>(); string[] array = (!Directory.Exists(path)) ? new string[0] : Directory.GetFiles(path); DefaultAssemblyResolver assemblyResolver = AssemblyReferenceChecker.AssemblyResolverFor(path); string[] array2 = array; for (int i = 0; i < array2.Length; i++) { string text = array2[i]; if (!(Path.GetExtension(text) != ".dll")) { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(text, new ReaderParameters { AssemblyResolver = assemblyResolver }); if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(assemblyDefinition.Name.Name)) { this._assemblyFileNames.Add(Path.GetFileName(text)); this._assemblyDefinitions.Add(assemblyDefinition); } } } AssemblyDefinition[] array3 = this._assemblyDefinitions.ToArray <AssemblyDefinition>(); this._referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(array3); if (collectMethods) { this.CollectReferencedAndDefinedMethods(array3); } }
private static void ExtractNativeMethodsFromTypes(ICollection <TypeDefinition> types, ArrayList res) { foreach (TypeDefinition current in types) { using (Collection <MethodDefinition> .Enumerator enumerator2 = current.get_Methods().GetEnumerator()) { while (enumerator2.MoveNext()) { MethodDefinition current2 = enumerator2.get_Current(); if (current2.get_IsStatic() && current2.get_IsPInvokeImpl() && current2.get_PInvokeInfo().get_Module().get_Name().Equals("__Internal")) { if (res.Contains(current2.get_Name())) { throw new SystemException("Duplicate native method found : " + current2.get_Name() + ". Please check your source carefully."); } res.Add(current2.get_Name()); } } } if (current.get_HasNestedTypes()) { MonoAOTRegistration.ExtractNativeMethodsFromTypes(current.get_NestedTypes(), res); } } }
private static void ExtractNativeMethodsFromTypes(ICollection <TypeDefinition> types, ArrayList res) { using (IEnumerator <TypeDefinition> enumerator1 = ((IEnumerable <TypeDefinition>)types).GetEnumerator()) { while (((IEnumerator)enumerator1).MoveNext()) { TypeDefinition current1 = enumerator1.Current; using (Collection <MethodDefinition> .Enumerator enumerator2 = current1.get_Methods().GetEnumerator()) { // ISSUE: explicit reference operation while (((Collection <MethodDefinition> .Enumerator)@enumerator2).MoveNext()) { // ISSUE: explicit reference operation MethodDefinition current2 = ((Collection <MethodDefinition> .Enumerator)@enumerator2).get_Current(); if (current2.get_IsStatic() && current2.get_IsPInvokeImpl() && current2.get_PInvokeInfo().get_Module().get_Name().Equals("__Internal")) { if (res.Contains((object)((MemberReference)current2).get_Name())) { throw new SystemException("Duplicate native method found : " + ((MemberReference)current2).get_Name() + ". Please check your source carefully."); } res.Add((object)((MemberReference)current2).get_Name()); } } } if (current1.get_HasNestedTypes()) { MonoAOTRegistration.ExtractNativeMethodsFromTypes((ICollection <TypeDefinition>)current1.get_NestedTypes(), res); } } } }
public string WhoReferencesClass(string klass, bool ignoreSystemDlls) { // ISSUE: object of a compiler-generated type is created // ISSUE: variable of a compiler-generated type AssemblyReferenceChecker.\u003CWhoReferencesClass\u003Ec__AnonStoreyBD classCAnonStoreyBd = new AssemblyReferenceChecker.\u003CWhoReferencesClass\u003Ec__AnonStoreyBD(); // ISSUE: reference to a compiler-generated field classCAnonStoreyBd.klass = klass; using (HashSet <AssemblyDefinition> .Enumerator enumerator = this.assemblyDefinitions.GetEnumerator()) { while (enumerator.MoveNext()) { AssemblyDefinition current = enumerator.Current; if (!ignoreSystemDlls || !this.IsiPhoneIgnoredSystemDll(((AssemblyNameReference)current.get_Name()).get_Name())) { // ISSUE: reference to a compiler-generated method if (MonoAOTRegistration.BuildReferencedTypeList(new AssemblyDefinition[1] { current }).Any <string>(new Func <string, bool>(classCAnonStoreyBd.\u003C\u003Em__22C))) { return(((AssemblyNameReference)current.get_Name()).get_Name()); } } } } return((string)null); }
public static void GenerateRegisterInternalCalls(AssemblyDefinition[] assemblies, TextWriter output) { output.Write("void RegisterAllStrippedInternalCalls ()\n{\n"); foreach (AssemblyDefinition assembly in assemblies) { MonoAOTRegistration.GenerateRegisterInternalCallsForTypes((IEnumerable <TypeDefinition>)assembly.get_MainModule().get_Types(), output); } output.Write("\n}\n"); }
public static void GenerateRegisterInternalCalls(AssemblyDefinition[] assemblies, TextWriter output) { output.Write("void RegisterAllStrippedInternalCalls ()\n{\n"); for (int i = 0; i < assemblies.Length; i++) { AssemblyDefinition assemblyDefinition = assemblies[i]; MonoAOTRegistration.GenerateRegisterInternalCallsForTypes(assemblyDefinition.MainModule.Types, output); } output.Write("\n}\n"); }
public void CollectReferencesFromRoots(string dir, IEnumerable <string> roots, bool withMethods, float progressValue, bool ignoreSystemDlls) { this.CollectReferencesFromRootsRecursive(dir, roots, ignoreSystemDlls); AssemblyDefinition[] array = this.assemblyDefinitions.ToArray <AssemblyDefinition>(); this.referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(array); if (withMethods) { this.CollectReferencedMethods(array, this.referencedMethods, this.definedMethods, progressValue); } }
private static void GenerateRegisterInternalCallsForTypes(IEnumerable <TypeDefinition> types, TextWriter output) { foreach (TypeDefinition current in types) { foreach (MethodDefinition current2 in current.Methods) { MonoAOTRegistration.GenerateInternalCallMethod(current, current2, output); } MonoAOTRegistration.GenerateRegisterInternalCallsForTypes(current.NestedTypes, output); } }
private static ArrayList BuildNativeMethodList(AssemblyDefinition[] assemblies) { ArrayList res = new ArrayList(); foreach (AssemblyDefinition assembly in assemblies) { if (!"System".Equals(((AssemblyNameReference)assembly.get_Name()).get_Name())) { MonoAOTRegistration.ExtractNativeMethodsFromTypes((ICollection <TypeDefinition>)assembly.get_MainModule().get_Types(), res); } } return(res); }
private static ArrayList BuildNativeMethodList(AssemblyDefinition[] assemblies) { ArrayList arrayList = new ArrayList(); for (int i = 0; i < assemblies.Length; i++) { AssemblyDefinition assemblyDefinition = assemblies[i]; if (!"System".Equals(assemblyDefinition.Name.Name)) { MonoAOTRegistration.ExtractNativeMethodsFromTypes(assemblyDefinition.MainModule.Types, arrayList); } } return(arrayList); }
// Follows actually referenced libraries only public void CollectReferencesFromRoots(string dir, IEnumerable <string> roots, bool collectMethods, float progressValue, bool ignoreSystemDlls) { _progressValue = progressValue; CollectReferencesFromRootsRecursive(dir, roots, ignoreSystemDlls); var assemblyDefinitionsAsArray = _assemblyDefinitions.ToArray(); _referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(assemblyDefinitionsAsArray); if (collectMethods) { CollectReferencedAndDefinedMethods(assemblyDefinitionsAsArray); } }
private static void GenerateRegisterInternalCallsForTypes(IEnumerable <TypeDefinition> types, TextWriter output) { foreach (TypeDefinition current in types) { using (Collection <MethodDefinition> .Enumerator enumerator2 = current.get_Methods().GetEnumerator()) { while (enumerator2.MoveNext()) { MethodDefinition current2 = enumerator2.get_Current(); MonoAOTRegistration.GenerateInternalCallMethod(current, current2, output); } } MonoAOTRegistration.GenerateRegisterInternalCallsForTypes(current.get_NestedTypes(), output); } }
public static void GenerateRegisterInternalCalls(AssemblyDefinition[] assemblies, TextWriter output) { output.Write("void RegisterAllStrippedInternalCalls ()\n{\n"); for (int i = 0; i < assemblies.Length; i++) { AssemblyDefinition assemblyDefinition = assemblies[i]; foreach (TypeDefinition current in assemblyDefinition.MainModule.Types) { foreach (MethodDefinition current2 in current.Methods) { MonoAOTRegistration.GenerateInternalCallMethod(current, current2, output); } } } output.Write("\n}\n"); }
public string WhoReferencesClass(string klass, bool ignoreSystemDlls) { foreach (AssemblyDefinition current in this.assemblyDefinitions) { if (!ignoreSystemDlls || !this.IsiPhoneIgnoredSystemDll(current.Name.Name)) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { current }; HashSet <string> source = MonoAOTRegistration.BuildReferencedTypeList(assemblies); if (source.Any((string item) => item.StartsWith(klass))) { return(current.Name.Name); } } } return(null); }
public string WhoReferencesClass(string klass, bool ignoreSystemDlls) { foreach (var assembly in _assemblyDefinitions) { if (ignoreSystemDlls && IsIgnoredSystemDll(assembly)) { continue; } var assemblyDefinitionsAsArray = new[] { assembly }; var types = MonoAOTRegistration.BuildReferencedTypeList(assemblyDefinitionsAsArray); if (types.Any(item => item.StartsWith(klass))) { return(assembly.Name.Name); } } return(null); }
private static void GenerateRegisterInternalCallsForTypes(IEnumerable <TypeDefinition> types, TextWriter output) { using (IEnumerator <TypeDefinition> enumerator1 = types.GetEnumerator()) { while (((IEnumerator)enumerator1).MoveNext()) { TypeDefinition current1 = enumerator1.Current; using (Collection <MethodDefinition> .Enumerator enumerator2 = current1.get_Methods().GetEnumerator()) { // ISSUE: explicit reference operation while (((Collection <MethodDefinition> .Enumerator)@enumerator2).MoveNext()) { // ISSUE: explicit reference operation MethodDefinition current2 = ((Collection <MethodDefinition> .Enumerator)@enumerator2).get_Current(); MonoAOTRegistration.GenerateInternalCallMethod(current1, current2, output); } } MonoAOTRegistration.GenerateRegisterInternalCallsForTypes((IEnumerable <TypeDefinition>)current1.get_NestedTypes(), output); } } }
private static void ExtractNativeMethodsFromTypes(ICollection <TypeDefinition> types, ArrayList res) { foreach (TypeDefinition current in types) { foreach (MethodDefinition current2 in current.Methods) { if (current2.IsStatic && current2.IsPInvokeImpl && current2.PInvokeInfo.Module.Name.Equals("__Internal")) { if (res.Contains(current2.Name)) { throw new SystemException("Duplicate native method found : " + current2.Name + ". Please check your source carefully."); } res.Add(current2.Name); } } if (current.HasNestedTypes) { MonoAOTRegistration.ExtractNativeMethodsFromTypes(current.NestedTypes, res); } } }
public void CollectReferences(string path, bool collectMethods, float progressValue, bool ignoreSystemDlls) { _progressValue = progressValue; _assemblyDefinitions = new HashSet <AssemblyDefinition>(); var filePaths = Directory.Exists(path) ? Directory.GetFiles(path) : new string[0]; using (var resolver = AssemblyResolverFor(path)) { foreach (var filePath in filePaths) { if (Path.GetExtension(filePath) != ".dll") { continue; } var assembly = AssemblyDefinition.ReadAssembly(filePath, new ReaderParameters { AssemblyResolver = resolver }); if (ignoreSystemDlls && IsIgnoredSystemDll(assembly)) { continue; } _assemblyFileNames.Add(Path.GetFileName(filePath)); _assemblyDefinitions.Add(assembly); } } var assemblyDefinitionsAsArray = _assemblyDefinitions.ToArray(); _referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(assemblyDefinitionsAsArray); if (collectMethods) { CollectReferencedAndDefinedMethods(assemblyDefinitionsAsArray); } }
public void CollectReferences(string path, bool withMethods, float progressValue, bool ignoreSystemDlls) { this.assemblyDefinitions = new HashSet <AssemblyDefinition>(); string[] strArray = !Directory.Exists(path) ? new string[0] : Directory.GetFiles(path); foreach (string str in strArray) { if (Path.GetExtension(str) == ".dll") { AssemblyDefinition item = AssemblyDefinition.ReadAssembly(str); if (!ignoreSystemDlls || !this.IsiPhoneIgnoredSystemDll(item.Name.Name)) { this.assemblyFileNames.Add(Path.GetFileName(str)); this.assemblyDefinitions.Add(item); } } } AssemblyDefinition[] assemblies = this.assemblyDefinitions.ToArray <AssemblyDefinition>(); this.referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(assemblies); if (withMethods) { this.CollectReferencedMethods(assemblies, this.referencedMethods, this.definedMethods, progressValue); } }
public string WhoReferencesClass(string klass, bool ignoreSystemDlls) { string result; foreach (AssemblyDefinition current in this._assemblyDefinitions) { if (!ignoreSystemDlls || !AssemblyReferenceChecker.IsIgnoredSystemDll(current.Name.Name)) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { current }; HashSet <string> source = MonoAOTRegistration.BuildReferencedTypeList(assemblies); if (source.Any((string item) => item.StartsWith(klass))) { result = current.Name.Name; return(result); } } } result = null; return(result); }
public void CollectReferences(string path, bool withMethods, float progressValue, bool ignoreSystemDlls) { this.assemblyDefinitions = new HashSet <AssemblyDefinition>(); foreach (string path1 in !Directory.Exists(path) ? new string[0] : Directory.GetFiles(path)) { if (!(Path.GetExtension(path1) != ".dll")) { AssemblyDefinition assemblyDefinition = AssemblyDefinition.ReadAssembly(path1); if (!ignoreSystemDlls || !this.IsiPhoneIgnoredSystemDll(((AssemblyNameReference)assemblyDefinition.get_Name()).get_Name())) { this.assemblyFileNames.Add(Path.GetFileName(path1)); this.assemblyDefinitions.Add(assemblyDefinition); } } } AssemblyDefinition[] array = ((IEnumerable <AssemblyDefinition>) this.assemblyDefinitions).ToArray <AssemblyDefinition>(); this.referencedTypes = MonoAOTRegistration.BuildReferencedTypeList(array); if (!withMethods) { return; } this.CollectReferencedMethods(array, this.referencedMethods, this.definedMethods, progressValue); }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter output = (TextWriter) new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { output.WriteLine("#include \"RegisterMonoModules.h\""); output.WriteLine("#include <stdio.h>"); } output.WriteLine(string.Empty); output.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); output.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); output.WriteLine(" do {\\"); output.WriteLine(" if(f != NULL)\\"); output.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); output.WriteLine(" else\\"); output.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); output.WriteLine(" }while(0)"); output.WriteLine("#else"); output.WriteLine(" #define DECL_USER_FUNC(f) void f() "); output.WriteLine(" #if !defined(__arm64__)"); output.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); output.WriteLine(" #else"); output.WriteLine(" #define REGISTER_USER_FUNC(f)"); output.WriteLine(" #endif"); output.WriteLine("#endif"); output.WriteLine("extern \"C\"\n{"); output.WriteLine(" typedef void* gpointer;"); output.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { output.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", (object)Application.unityVersion); output.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); output.WriteLine("#if !defined(__arm64__)"); output.WriteLine(" extern int mono_ficall_flag;"); output.WriteLine("#endif"); } output.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); output.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); output.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); output.WriteLine("#else"); output.WriteLine("#define DLL_EXPORT"); output.WriteLine("#endif"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); output.WriteLine(" extern gboolean mono_aot_only;"); for (int index = 0; index < assemblyFileNames.Length; ++index) { string str1 = assemblyFileNames[index]; string str2 = ((AssemblyNameReference)assemblyDefinitions[index].get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", (object)str2, (object)str1); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string str in arrayList) { output.WriteLine(" DECL_USER_FUNC({0});", (object)str); } output.WriteLine("}"); output.WriteLine("DLL_EXPORT void RegisterMonoModules()"); output.WriteLine("{"); output.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { output.WriteLine(" mono_ficall_flag = {0};", !flag ? (object)"false" : (object)"true"); } foreach (AssemblyDefinition assemblyDefinition in assemblyDefinitions) { string str = ((AssemblyNameReference)assemblyDefinition.get_Name()).get_Name().Replace(".", "_").Replace("-", "_").Replace(" ", "_"); output.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", (object)str); } output.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); output.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { foreach (string str in arrayList) { output.WriteLine(" REGISTER_USER_FUNC({0});", (object)str); } } output.WriteLine("}"); output.WriteLine(string.Empty); AssemblyDefinition unityEngine = (AssemblyDefinition)null; for (int index = 0; index < assemblyFileNames.Length; ++index) { if (assemblyFileNames[index] == "UnityEngine.dll") { unityEngine = assemblyDefinitions[index]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[1] { unityEngine }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, output); MonoAOTRegistration.ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); MonoAOTRegistration.ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry); MonoAOTRegistration.GenerateRegisterModules(usedClassRegistry, output, stripping); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(usedClassRegistry, output); } else { MonoAOTRegistration.GenerateRegisterClasses(usedClassRegistry, output); } } output.Close(); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged) { MonoAOTRegistration.WriteCPlusPlusFileForStaticAOTModuleRegistration(buildTarget, file, crossCompileOptions, advancedLic, targetDevice, stripping, usedClassRegistry, checker, stagingAreaDataManaged, null); }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged, IIl2CppPlatformProvider platformProvider) { string text = Path.Combine(stagingAreaDataManaged, "ICallSummary.txt"); string exe = Path.Combine(MonoInstallationFinder.GetFrameWorksFolder(), "Tools/InternalCallRegistrationWriter/InternalCallRegistrationWriter.exe"); string args = string.Format("-assembly=\"{0}\" -summary=\"{1}\"", Path.Combine(stagingAreaDataManaged, "UnityEngine.dll"), text); Runner.RunManagedProgram(exe, args); HashSet <UnityType> hashSet; HashSet <string> nativeModules; CodeStrippingUtils.GenerateDependencies(Path.GetDirectoryName(stagingAreaDataManaged), text, usedClassRegistry, stripping, out hashSet, out nativeModules, platformProvider); using (TextWriter textWriter = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("#include \"RegisterMonoModules.h\""); textWriter.WriteLine("#include <stdio.h>"); } textWriter.WriteLine(""); textWriter.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); textWriter.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f)\\"); textWriter.WriteLine(" do {\\"); textWriter.WriteLine(" if(f != NULL)\\"); textWriter.WriteLine(" mono_dl_register_symbol(#f, (void*)f);\\"); textWriter.WriteLine(" else\\"); textWriter.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); textWriter.WriteLine(" }while(0)"); textWriter.WriteLine("#else"); textWriter.WriteLine(" #define DECL_USER_FUNC(f) void f() "); textWriter.WriteLine(" #if !defined(__arm64__)"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); textWriter.WriteLine(" #else"); textWriter.WriteLine(" #define REGISTER_USER_FUNC(f)"); textWriter.WriteLine(" #endif"); textWriter.WriteLine("#endif"); textWriter.WriteLine("extern \"C\"\n{"); textWriter.WriteLine(" typedef void* gpointer;"); textWriter.WriteLine(" typedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); textWriter.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);"); textWriter.WriteLine("#if !defined(__arm64__)"); textWriter.WriteLine(" extern int mono_ficall_flag;"); textWriter.WriteLine("#endif"); } textWriter.WriteLine(" void mono_aot_register_module(gpointer *aot_info);"); textWriter.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2"); textWriter.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); textWriter.WriteLine("#else"); textWriter.WriteLine("#define DLL_EXPORT"); textWriter.WriteLine("#endif"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); textWriter.WriteLine(" extern gboolean mono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string arg = assemblyFileNames[i]; string text2 = assemblyDefinitions[i].Name.Name; text2 = text2.Replace(".", "_"); text2 = text2.Replace("-", "_"); text2 = text2.Replace(" ", "_"); textWriter.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", text2, arg); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); IEnumerator enumerator = arrayList.GetEnumerator(); try { while (enumerator.MoveNext()) { string arg2 = (string)enumerator.Current; textWriter.WriteLine(" DECL_USER_FUNC({0});", arg2); } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } textWriter.WriteLine("}"); textWriter.WriteLine("DLL_EXPORT void RegisterMonoModules()"); textWriter.WriteLine("{"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(" mono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine(" mono_ficall_flag = {0};", (!flag) ? "false" : "true"); } AssemblyDefinition[] array = assemblyDefinitions; for (int j = 0; j < array.Length; j++) { AssemblyDefinition assemblyDefinition = array[j]; string text3 = assemblyDefinition.Name.Name; text3 = text3.Replace(".", "_"); text3 = text3.Replace("-", "_"); text3 = text3.Replace(" ", "_"); textWriter.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", text3); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(""); if (buildTarget == BuildTarget.iOS) { IEnumerator enumerator2 = arrayList.GetEnumerator(); try { while (enumerator2.MoveNext()) { string arg3 = (string)enumerator2.Current; textWriter.WriteLine(" REGISTER_USER_FUNC({0});", arg3); } } finally { IDisposable disposable2; if ((disposable2 = (enumerator2 as IDisposable)) != null) { disposable2.Dispose(); } } } textWriter.WriteLine("}"); textWriter.WriteLine(""); AssemblyDefinition assemblyDefinition2 = null; for (int k = 0; k < assemblyFileNames.Length; k++) { if (assemblyFileNames[k] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[k]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { assemblyDefinition2 }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, textWriter); MonoAOTRegistration.GenerateRegisterModules(hashSet, nativeModules, textWriter, stripping); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(hashSet, textWriter); } else { MonoAOTRegistration.GenerateRegisterClasses(hashSet, textWriter); } } textWriter.Close(); } }
public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker) { using (TextWriter textWriter = new StreamWriter(file)) { string[] assemblyFileNames = checker.GetAssemblyFileNames(); AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions(); bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic; ArrayList arrayList = MonoAOTRegistration.BuildNativeMethodList(assemblyDefinitions); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("#include \"RegisterMonoModules.h\""); textWriter.WriteLine("#include <stdio.h>"); } textWriter.WriteLine(string.Empty); textWriter.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR"); textWriter.WriteLine("\t#define DECL_USER_FUNC(f) void f() __attribute__((weak_import))"); textWriter.WriteLine("\t#define REGISTER_USER_FUNC(f)\\"); textWriter.WriteLine("\t\tdo {\\"); textWriter.WriteLine("\t\tif(f != NULL)\\"); textWriter.WriteLine("\t\t\tmono_dl_register_symbol(#f, (void*)f);\\"); textWriter.WriteLine("\t\telse\\"); textWriter.WriteLine("\t\t\t::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\"); textWriter.WriteLine("\t\t}while(0)"); textWriter.WriteLine("#else"); textWriter.WriteLine("\t#define DECL_USER_FUNC(f) void f() "); textWriter.WriteLine("\t#if !defined(__arm64__)"); textWriter.WriteLine("\t#define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)"); textWriter.WriteLine("\t#else"); textWriter.WriteLine("\t\t#define REGISTER_USER_FUNC(f)"); textWriter.WriteLine("\t#endif"); textWriter.WriteLine("#endif"); textWriter.WriteLine("extern \"C\"\n{"); textWriter.WriteLine("\ttypedef void* gpointer;"); textWriter.WriteLine("\ttypedef int gboolean;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("\tconst char*\t\t\tUnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion); textWriter.WriteLine("\tvoid\t\t\t\tmono_dl_register_symbol (const char* name, void *addr);"); textWriter.WriteLine("#if !defined(__arm64__)"); textWriter.WriteLine("\textern int\t\t\tmono_ficall_flag;"); textWriter.WriteLine("#endif"); } textWriter.WriteLine("\tvoid\t\t\t\tmono_aot_register_module(gpointer *aot_info);"); textWriter.WriteLine("#if !(__ORBIS__)"); textWriter.WriteLine("#define DLL_EXPORT"); textWriter.WriteLine("#else"); textWriter.WriteLine("#define DLL_EXPORT __declspec(dllexport)"); textWriter.WriteLine("#endif"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)"); textWriter.WriteLine("\textern gboolean\t\tmono_aot_only;"); for (int i = 0; i < assemblyFileNames.Length; i++) { string arg = assemblyFileNames[i]; string text = assemblyDefinitions[i].Name.Name; text = text.Replace(".", "_"); text = text.Replace("-", "_"); text = text.Replace(" ", "_"); textWriter.WriteLine("\textern gpointer*\tmono_aot_module_{0}_info; // {1}", text, arg); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)"); foreach (string arg2 in arrayList) { textWriter.WriteLine("\tDECL_USER_FUNC({0});", arg2); } textWriter.WriteLine("}"); textWriter.WriteLine("DLL_EXPORT void RegisterMonoModules()"); textWriter.WriteLine("{"); textWriter.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine("\tmono_aot_only = true;"); if (buildTarget == BuildTarget.iOS) { textWriter.WriteLine("\tmono_ficall_flag = {0};", (!flag) ? "false" : "true"); } AssemblyDefinition[] array = assemblyDefinitions; for (int j = 0; j < array.Length; j++) { AssemblyDefinition assemblyDefinition = array[j]; string text2 = assemblyDefinition.Name.Name; text2 = text2.Replace(".", "_"); text2 = text2.Replace("-", "_"); text2 = text2.Replace(" ", "_"); textWriter.WriteLine("\tmono_aot_register_module(mono_aot_module_{0}_info);", text2); } textWriter.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)"); textWriter.WriteLine(string.Empty); if (buildTarget == BuildTarget.iOS) { foreach (string arg3 in arrayList) { textWriter.WriteLine("\tREGISTER_USER_FUNC({0});", arg3); } } textWriter.WriteLine("}"); textWriter.WriteLine(string.Empty); AssemblyDefinition assemblyDefinition2 = null; for (int k = 0; k < assemblyFileNames.Length; k++) { if (assemblyFileNames[k] == "UnityEngine.dll") { assemblyDefinition2 = assemblyDefinitions[k]; } } if (buildTarget == BuildTarget.iOS) { AssemblyDefinition[] assemblies = new AssemblyDefinition[] { assemblyDefinition2 }; MonoAOTRegistration.GenerateRegisterInternalCalls(assemblies, textWriter); MonoAOTRegistration.ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry); MonoAOTRegistration.ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, assemblyDefinition2, usedClassRegistry); if (stripping && usedClassRegistry != null) { MonoAOTRegistration.GenerateRegisterClassesForStripping(usedClassRegistry, textWriter); } else { MonoAOTRegistration.GenerateRegisterClasses(usedClassRegistry, textWriter); } } textWriter.Close(); } }