powerfun-unity/Assets/Editor/Beebyte/Obfuscator/Assembly/AssemblyReferenceLocator.cs

75 lines
2.1 KiB
C#
Raw Normal View History

2023-04-14 15:51:28 +08:00
#if UNITY_2017_3_OR_NEWER
/*
* Copyright (c) 2018-2021 Beebyte Limited. All rights reserved.
*/
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEditor.Compilation;
namespace Beebyte.Obfuscator.Assembly
{
public class AssemblyReferenceLocator
{
public static IEnumerable<string> GetAssemblyReferenceDirectories()
{
HashSet<string> directories = new HashSet<string>();
foreach (UnityEditor.Compilation.Assembly assembly in CompilationPipeline.GetAssemblies())
{
directories.UnionWith(GetAssemblyReferenceDirectories(assembly));
}
directories.Add("./Library/PlayerScriptAssemblies".Replace('/', Path.DirectorySeparatorChar));
directories.UnionWith(GetUnityEditorLibDirectories());
return directories;
}
private static IEnumerable<string> GetUnityEditorLibDirectories()
{
HashSet<string> libDirectories = new HashSet<string>();
Stack<string> stack = new Stack<string>();
var monoPath = EditorApplication.applicationContentsPath +
Path.DirectorySeparatorChar.ToString() +
"MonoBleedingEdge" +
Path.DirectorySeparatorChar.ToString() +
"lib" +
Path.DirectorySeparatorChar.ToString() +
"mono";
stack.Push(monoPath);
while (stack.Count > 0)
{
string dir = stack.Pop();
if (Directory.GetFiles(dir, "*.dll").Length > 0)
{
libDirectories.Add(dir);
}
foreach (var childDirectory in Directory.GetDirectories(dir))
{
stack.Push(childDirectory);
}
}
return libDirectories;
}
private static IEnumerable<string> GetAssemblyReferenceDirectories(UnityEditor.Compilation.Assembly assembly)
{
HashSet<string> directories = new HashSet<string>();
if (assembly == null) return directories;
if (assembly.compiledAssemblyReferences == null || assembly.compiledAssemblyReferences.Length <= 0)
{
return directories;
}
foreach (string assemblyRef in assembly.compiledAssemblyReferences)
{
directories.Add(Path.GetDirectoryName(assemblyRef));
}
return directories;
}
}
}
#endif