三国卡牌客户端基础资源仓库
hch
2025-06-20 4841e82bd5e399c4fc39313bbc93c6fc1bb12b2a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
using dnlib.DotNet;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace HybridCLR.Editor.Link
{
    internal class LinkXmlWriter
    {
        public void Write(string outputLinkXmlFile, HashSet<TypeRef> refTypes)
        {
            string parentDir = Directory.GetParent(outputLinkXmlFile).FullName;
            Directory.CreateDirectory(parentDir);
            var writer = System.Xml.XmlWriter.Create(outputLinkXmlFile,
                new System.Xml.XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true});
 
            writer.WriteStartDocument();
            writer.WriteStartElement("linker");
 
            var typesByAssembly = refTypes.GroupBy(t => t.DefinitionAssembly.Name.String).ToList();
            typesByAssembly.Sort((a, b) => String.Compare(a.Key, b.Key, StringComparison.Ordinal));
 
            foreach(var assembly in typesByAssembly)
            {
                writer.WriteStartElement("assembly");
                writer.WriteAttributeString("fullname", assembly.Key);
                List<string> assTypeNames = assembly.Select(t => t.FullName).ToList();
                assTypeNames.Sort(string.CompareOrdinal);
                foreach(var typeName in assTypeNames)
                {
#if UNITY_2023_1_OR_NEWER
                    if (typeName == "UnityEngine.Debug")
                    {
                        continue;
                    }
#endif
                    writer.WriteStartElement("type");
                    writer.WriteAttributeString("fullname", typeName);
                    writer.WriteAttributeString("preserve", "all");
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
            writer.WriteEndDocument();
            writer.Close();
        }
    }
}