TaiZhouCangChu_VRanime/Library/PackageCache/com.unity.multiplayer-hlapi.../Editor/WeaverRunner.cs

137 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor.Compilation;
using UnityEngine;
using Assembly = System.Reflection.Assembly;
namespace UnityEditor.Networking
{
internal class WeaverRunner
{
[InitializeOnLoadMethod]
static void OnInitializeOnLoad()
{
CompilationPipeline.assemblyCompilationFinished += OnCompilationFinished;
}
internal static void OnCompilationFinished(string targetAssembly, CompilerMessage[] messages)
{
const string k_HlapiRuntimeAssemblyName = "com.unity.multiplayer-hlapi.Runtime";
// Do nothing if there were compile errors on the target
if (messages.Length > 0)
{
foreach (var msg in messages)
{
if (msg.type == CompilerMessageType.Error)
{
return;
}
}
}
// Should not run on the editor only assemblies
if (targetAssembly.Contains("-Editor") || targetAssembly.Contains(".Editor"))
{
return;
}
// Should not run on own assembly or Unity assemblies
if (targetAssembly.Contains("com.unity") || Path.GetFileName(targetAssembly).StartsWith("Unity"))
{
return;
}
var scriptAssembliesPath = Application.dataPath + "/../" + Path.GetDirectoryName(targetAssembly);
string unityEngine = "";
string unetAssemblyPath = "";
var outputDirectory = scriptAssembliesPath;
var assemblyPath = targetAssembly;
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
bool usesUnet = false;
bool foundThisAssembly = false;
HashSet<string> depenencyPaths = new HashSet<string>();
foreach (var assembly in assemblies)
{
// Find the assembly currently being compiled from domain assembly list and check if it's using unet
if (assembly.GetName().Name == Path.GetFileNameWithoutExtension(targetAssembly))
{
foundThisAssembly = true;
foreach (var dependency in assembly.GetReferencedAssemblies())
{
// Since this assembly is already loaded in the domain this is a no-op and retuns the
// already loaded assembly
var location = Assembly.Load(dependency).Location;
depenencyPaths.Add(Path.GetDirectoryName(location));
if (dependency.Name.Contains(k_HlapiRuntimeAssemblyName))
{
usesUnet = true;
}
}
}
try
{
if (assembly.Location.Contains("UnityEngine.CoreModule"))
{
unityEngine = assembly.Location;
}
if (assembly.Location.Contains(k_HlapiRuntimeAssemblyName))
{
unetAssemblyPath = assembly.Location;
}
}
catch (NotSupportedException)
{
// in memory assembly, can't get location
}
}
if (!foundThisAssembly)
{
// Target assembly not found in current domain, trying to load it to check references
// will lead to trouble in the build pipeline, so lets assume it should go to weaver.
// Add all assemblies in current domain to dependency list since there could be a
// dependency lurking there (there might be generated assemblies so ignore file not found exceptions).
// (can happen in runtime test framework on editor platform and when doing full library reimport)
foreach (var assembly in assemblies)
{
try
{
if (!(assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder))
{
var location = Assembly.Load(assembly.GetName().Name).Location;
if (!string.IsNullOrEmpty(location))
depenencyPaths.Add(Path.GetDirectoryName(location));
}
}
catch (FileNotFoundException) { }
}
usesUnet = true;
}
if (!usesUnet)
{
return;
}
if (string.IsNullOrEmpty(unityEngine))
{
Debug.LogError("Failed to find UnityEngine assembly");
return;
}
if (string.IsNullOrEmpty(unetAssemblyPath))
{
Debug.LogError("Failed to find hlapi runtime assembly");
return;
}
Unity.UNetWeaver.Program.Process(unityEngine, unetAssemblyPath, outputDirectory, new[] { assemblyPath }, depenencyPaths.ToArray(), (value) => { Debug.LogWarning(value); }, (value) => { Debug.LogError(value); });
}
}
}