// Called from native code when preparing assets for a build public static List <Type> ExtractTypesFromVisualTreeAsset(VisualTreeAsset asset) { if (s_PrecompiledUnityAssemblies == null) { // Ignore all precompiled Unity assemblies, but include those from users CompilationPipeline.PrecompiledAssemblySources sources = CompilationPipeline.PrecompiledAssemblySources.All; sources &= ~CompilationPipeline.PrecompiledAssemblySources.UserAssembly; s_PrecompiledUnityAssemblies = new HashSet <string>(CompilationPipeline.GetPrecompiledAssemblyPaths(sources)); } s_FactoryTypesUsedInAsset.Clear(); s_UsedTypesInsideAsset.Clear(); asset.ExtractUsedUxmlQualifiedNames(s_UsedTypesInsideAsset); foreach (var qualifiedName in s_UsedTypesInsideAsset) { if (VisualElementFactoryRegistry.TryGetValue(qualifiedName, out List <IUxmlFactory> factoryList)) { foreach (var factory in factoryList) { var type = factory.GetType(); if (s_PrecompiledUnityAssemblies.Contains(type.Assembly.Location)) { continue; } s_FactoryTypesUsedInAsset.Add(type); } } } return(s_FactoryTypesUsedInAsset); }