-
-
Notifications
You must be signed in to change notification settings - Fork 65
/
MirrorILPostProcessor.cs
45 lines (35 loc) · 1.46 KB
/
MirrorILPostProcessor.cs
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
using Unity.CompilationPipeline.Common.ILPostProcessing;
using System.Linq;
using System.IO;
using Mono.Cecil;
using Mono.Cecil.Cil;
namespace Mirror.Weaver
{
public class MirrorILPostProcessor : ILPostProcessor
{
public const string RuntimeAssemblyName = "Mirror";
public override ILPostProcessor GetInstance() => this;
public override ILPostProcessResult Process(ICompiledAssembly compiledAssembly)
{
if (!WillProcess(compiledAssembly))
return null;
var logger = new Logger();
var weaver = new Weaver(logger);
AssemblyDefinition assemblyDefinition = weaver.Weave(compiledAssembly);
// write
var pe = new MemoryStream();
var pdb = new MemoryStream();
var writerParameters = new WriterParameters
{
SymbolWriterProvider = new PortablePdbWriterProvider(),
SymbolStream = pdb,
WriteSymbols = true
};
assemblyDefinition?.Write(pe, writerParameters);
return new ILPostProcessResult(new InMemoryAssembly(pe.ToArray(), pdb.ToArray()), logger.Diagnostics);
}
public override bool WillProcess(ICompiledAssembly compiledAssembly) =>
compiledAssembly.Name == RuntimeAssemblyName ||
compiledAssembly.References.Any(filePath => Path.GetFileNameWithoutExtension(filePath) == RuntimeAssemblyName);
}
}