test(upserver): 归档存档迁移与玩法闭环回归工具

This commit is contained in:
Liubing\LB
2026-09-28 18:16:14 +08:00
parent c4ae02def9
commit a6f5e107f8
232 changed files with 12903 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Security.Cryptography;
using Newtonsoft.Json;
static class PrecompiledAudit
{
internal static int Run()
{
var root=Path.GetFullPath(Path.Combine(AppContext.BaseDirectory,"../../../../../.."));
if(!Directory.Exists(Path.Combine(root,"Client/Assets"))) throw new InvalidOperationException("Project root required.");
var files=new[]{"Client/Assets","Client/Packages","Client/LocalPackages","Client/Library/PackageCache"}.SelectMany(p=>Directory.Exists(Path.Combine(root,p)) ?
Directory.EnumerateFiles(Path.Combine(root,p),"*.dll",SearchOption.AllDirectories) : Array.Empty<string>()).OrderBy(p=>p,StringComparer.Ordinal).ToArray();
var rows=new List<object>(); int blocked=0,managed=0,native=0;
foreach(var file in files)
{
string kind="managed"; var references=new List<string>(); var assemblies=new List<string>();
using var stream=File.OpenRead(file);
try
{
using var pe=new PEReader(stream);
if(!pe.HasMetadata) { native++; kind="native"; }
else
{
managed++; var reader=pe.GetMetadataReader();
foreach(var h in reader.AssemblyReferences)
{ var name=reader.GetString(reader.GetAssemblyReference(h).Name); if(name=="HotUpdate") assemblies.Add(name); }
foreach(var h in reader.MemberReferences)
{
var member=reader.GetMemberReference(h); string name=reader.GetString(member.Name);
if(name!="BuilderCapacity" || member.Parent.Kind!=HandleKind.TypeReference) continue;
var t=reader.GetTypeReference((TypeReferenceHandle)member.Parent);
if(reader.GetString(t.Namespace)=="EventPartnerGather" && reader.GetString(t.Name)=="PartnerInfoManager") references.Add("EventPartnerGather.PartnerInfoManager.BuilderCapacity");
}
if(references.Count>0) blocked++;
}
}
catch(BadImageFormatException) { kind="unreadable-PE"; blocked++; }
rows.Add(new { path=Path.GetRelativePath(root,file).Replace('\\','/'),sha256=Convert.ToHexString(SHA256.HashData(File.ReadAllBytes(file))),kind,fieldReferences=references,hotUpdateReferences=assemblies });
}
var report=new { success=blocked==0,scope="Assets-Packages-LocalPackages-PackageCache-dlls",total=files.Length,managed,native,blocked,files=rows };
File.WriteAllText(Path.Combine(root,"CodexOutput/upserver/KVGameLoadTests/checkpoint2-D4-precompiled-audit.json"),JsonConvert.SerializeObject(report,Formatting.Indented));
Console.WriteLine($"PRECOMPILED total={files.Length} managed={managed} native={native} blocked={blocked}");
return blocked==0 ? 0 : 1;
}
}