public static IEnumerable <string> GetPrecompiledAssemblyDirectories(PrecompiledAssemblyTypes flags)
 {
     foreach (var dir in GetPrecompiledAssemblyPaths(flags).Select(path => Path.GetDirectoryName(path)).Distinct())
     {
         yield return(dir);
     }
 }
        internal static IEnumerable <string> GetPrecompiledAssemblyPaths(PrecompiledAssemblyTypes flags)
        {
            var assemblyPaths = new List <string>();

#if UNITY_2019_1_OR_NEWER
            var precompiledAssemblySources = (CompilationPipeline.PrecompiledAssemblySources)flags;
            assemblyPaths.AddRange(CompilationPipeline.GetPrecompiledAssemblyPaths(precompiledAssemblySources));
#else
            if ((flags & PrecompiledAssemblyTypes.UnityEngine) != 0)
            {
                assemblyPaths.AddRange(Directory.GetFiles(Path.Combine(EditorApplication.applicationContentsPath,
                                                                       Path.Combine("Managed", "UnityEngine"))).Where(path => Path.GetExtension(path).Equals(".dll")));
            }
            if ((flags & PrecompiledAssemblyTypes.UnityEditor) != 0)
            {
                assemblyPaths.AddRange(Directory.GetFiles(Path.Combine(EditorApplication.applicationContentsPath,
                                                                       "Managed")).Where(path => Path.GetExtension(path).Equals(".dll")));
            }
            if ((flags & PrecompiledAssemblyTypes.UserAssembly) != 0)
            {
                assemblyPaths.AddRange(CompilationPipeline.GetPrecompiledAssemblyNames().Select(name => CompilationPipeline.GetPrecompiledAssemblyPathFromAssemblyName(name)));
            }
#endif

#if !UNITY_2019_2_OR_NEWER
            var extensions = new List <string>();
            if ((flags & PrecompiledAssemblyTypes.UnityEngine) != 0)
            {
                extensions.AddRange(new[]
                {
                    "UnityExtensions/Unity/Networking/UnityEngine.Networking.dll",
                    "UnityExtensions/Unity/Timeline/Runtime/UnityEngine.Timeline.dll",
                    "UnityExtensions/Unity/GUISystem/UnityEngine.UI.dll",
                });
            }
            if ((flags & PrecompiledAssemblyTypes.UnityEditor) != 0)
            {
                extensions.AddRange(new[]
                {
                    "UnityExtensions/Unity/Networking/Editor/UnityEditor.Networking.dll",
                    "UnityExtensions/Unity/Timeline/Editor/UnityEditor.Timeline.dll",
                    "UnityExtensions/Unity/GUISystem/Editor/UnityEditor.UI.dll",
                });
            }
            assemblyPaths.AddRange(extensions.Select(ext => Path.Combine(EditorApplication.applicationContentsPath, ext)));
#endif
            return(assemblyPaths.Select(path => path.Replace("\\", "/")));
        }