public static void WriteCPlusPlusFileForStaticAOTModuleRegistration(BuildTarget buildTarget, string file, CrossCompileOptions crossCompileOptions, bool advancedLic, string targetDevice, bool stripping, RuntimeClassRegistry usedClassRegistry, AssemblyReferenceChecker checker, string stagingAreaDataManaged)
{
HashSet<UnityType> set;
HashSet<string> set2;
string str = 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"), str);
Runner.RunManagedProgram(exe, args);
CodeStrippingUtils.GenerateDependencies(Path.GetDirectoryName(stagingAreaDataManaged), str, usedClassRegistry, stripping, out set, out set2, null);
using (TextWriter writer = new StreamWriter(file))
{
string[] assemblyFileNames = checker.GetAssemblyFileNames();
AssemblyDefinition[] assemblyDefinitions = checker.GetAssemblyDefinitions();
bool flag = (crossCompileOptions & CrossCompileOptions.FastICall) != CrossCompileOptions.Dynamic;
ArrayList list = BuildNativeMethodList(assemblyDefinitions);
if (buildTarget == BuildTarget.iOS)
{
writer.WriteLine("#include \"RegisterMonoModules.h\"");
writer.WriteLine("#include <stdio.h>");
}
writer.WriteLine("");
writer.WriteLine("#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR");
writer.WriteLine(" #define DECL_USER_FUNC(f) void f() __attribute__((weak_import))");
writer.WriteLine(@" #define REGISTER_USER_FUNC(f)\");
writer.WriteLine(@" do {\");
writer.WriteLine(@" if(f != NULL)\");
writer.WriteLine(@" mono_dl_register_symbol(#f, (void*)f);\");
writer.WriteLine(@" else\");
writer.WriteLine(" ::printf_console(\"Symbol '%s' not found. Maybe missing implementation for Simulator?\\n\", #f);\\");
writer.WriteLine(" }while(0)");
writer.WriteLine("#else");
writer.WriteLine(" #define DECL_USER_FUNC(f) void f() ");
writer.WriteLine(" #if !defined(__arm64__)");
writer.WriteLine(" #define REGISTER_USER_FUNC(f) mono_dl_register_symbol(#f, (void*)&f)");
writer.WriteLine(" #else");
writer.WriteLine(" #define REGISTER_USER_FUNC(f)");
writer.WriteLine(" #endif");
writer.WriteLine("#endif");
writer.WriteLine("extern \"C\"\n{");
writer.WriteLine(" typedef void* gpointer;");
writer.WriteLine(" typedef int gboolean;");
if (buildTarget == BuildTarget.iOS)
{
writer.WriteLine(" const char* UnityIPhoneRuntimeVersion = \"{0}\";", Application.unityVersion);
writer.WriteLine(" void mono_dl_register_symbol (const char* name, void *addr);");
writer.WriteLine("#if !defined(__arm64__)");
writer.WriteLine(" extern int mono_ficall_flag;");
writer.WriteLine("#endif");
}
writer.WriteLine(" void mono_aot_register_module(gpointer *aot_info);");
writer.WriteLine("#if __ORBIS__ || SN_TARGET_PSP2");
writer.WriteLine("#define DLL_EXPORT __declspec(dllexport)");
writer.WriteLine("#else");
writer.WriteLine("#define DLL_EXPORT");
writer.WriteLine("#endif");
writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR)");
writer.WriteLine(" extern gboolean mono_aot_only;");
for (int i = 0; i < assemblyFileNames.Length; i++)
{
string str4 = assemblyFileNames[i];
string str5 = assemblyDefinitions[i].Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_");
writer.WriteLine(" extern gpointer* mono_aot_module_{0}_info; // {1}", str5, str4);
}
writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR)");
IEnumerator enumerator = list.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
string current = (string) enumerator.Current;
writer.WriteLine(" DECL_USER_FUNC({0});", current);
}
}
finally
{
IDisposable disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
writer.WriteLine("}");
writer.WriteLine("DLL_EXPORT void RegisterMonoModules()");
writer.WriteLine("{");
writer.WriteLine("#if !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)");
writer.WriteLine(" mono_aot_only = true;");
if (buildTarget == BuildTarget.iOS)
{
writer.WriteLine(" mono_ficall_flag = {0};", !flag ? "false" : "true");
}
foreach (AssemblyDefinition definition in assemblyDefinitions)
{
string str7 = definition.Name.Name.Replace(".", "_").Replace("-", "_").Replace(" ", "_");
writer.WriteLine(" mono_aot_register_module(mono_aot_module_{0}_info);", str7);
}
writer.WriteLine("#endif // !(TARGET_IPHONE_SIMULATOR) && !defined(__arm64__)");
writer.WriteLine("");
if (buildTarget == BuildTarget.iOS)
{
IEnumerator enumerator2 = list.GetEnumerator();
try
{
while (enumerator2.MoveNext())
{
string str8 = (string) enumerator2.Current;
writer.WriteLine(" REGISTER_USER_FUNC({0});", str8);
}
}
finally
{
IDisposable disposable2 = enumerator2 as IDisposable;
if (disposable2 != null)
{
disposable2.Dispose();
}
}
}
writer.WriteLine("}");
writer.WriteLine("");
AssemblyDefinition unityEngine = null;
for (int j = 0; j < assemblyFileNames.Length; j++)
{
if (assemblyFileNames[j] == "UnityEngine.dll")
{
unityEngine = assemblyDefinitions[j];
}
}
if (buildTarget == BuildTarget.iOS)
{
AssemblyDefinition[] assemblies = new AssemblyDefinition[] { unityEngine };
GenerateRegisterInternalCalls(assemblies, writer);
ResolveDefinedNativeClassesFromMono(assemblies, usedClassRegistry);
ResolveReferencedUnityEngineClassesFromMono(assemblyDefinitions, unityEngine, usedClassRegistry);
GenerateRegisterModules(set, set2, writer, stripping);
if (stripping && (usedClassRegistry != null))
{
GenerateRegisterClassesForStripping(set, writer);
}
else
{
GenerateRegisterClasses(set, writer);
}
}
writer.Close();
}
}
}