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();
}
}