-
Notifications
You must be signed in to change notification settings - Fork 1
/
Patcher.cs
executable file
·127 lines (101 loc) · 2.78 KB
/
Patcher.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System.IO;
using System.Reflection;
using Mono.Cecil;
using Mono.Cecil.Mdb;
namespace UnityVS
{
class Patcher
{
private readonly string _unityEditor;
private readonly ModuleDefinition _module;
private readonly RewriteStep _rewriteStep;
public const string SupportAssemblyName = "UnityVS.Opener.dll";
public bool HasSymbols
{
get { return File.Exists(SymbolsFile()); }
}
public bool HasBackup
{
get { return File.Exists(BackupFile()); }
}
private string SymbolsFile()
{
return _unityEditor + ".mdb";
}
private string BackupFile()
{
return _unityEditor + ".backup";
}
private string BackupSymbolsFile()
{
return SymbolsFile() + ".backup";
}
private Patcher(string unityEditor)
{
_unityEditor = unityEditor;
_module = ModuleDefinition.ReadModule(_unityEditor, HasSymbols
? new ReaderParameters { SymbolReaderProvider = new MdbReaderProvider() }
: new ReaderParameters());
_rewriteStep = new RewriteOpenFileEntry(_module);
}
public bool ModuleCanBePatched()
{
return _rewriteStep.IsNecessary();
}
public void Patch()
{
if (!ModuleCanBePatched())
return;
if (!HasBackup)
MakeBackup();
PatchModule();
_module.Write(_unityEditor, HasSymbols
? new WriterParameters { SymbolWriterProvider = new MdbWriterProvider() }
: new WriterParameters());
MoveSupportAssembly();
}
private void PatchModule()
{
new RewriteOpenFileEntry(_module).Process();
}
private void MakeBackup()
{
if (HasBackup)
return;
File.Copy(_unityEditor, BackupFile(), overwrite: true);
if (HasSymbols)
File.Copy(SymbolsFile(), BackupSymbolsFile(), overwrite: true);
}
public void RestoreBackup()
{
if (!HasBackup)
return;
File.Copy(BackupFile(), _unityEditor, overwrite: true);
File.Delete(BackupFile());
if (File.Exists(BackupSymbolsFile()))
{
File.Copy(BackupSymbolsFile(), SymbolsFile(), overwrite: true);
File.Delete(BackupSymbolsFile());
}
var supportAssembly = SupportAssembly();
if (File.Exists(supportAssembly))
File.Delete(SupportAssembly());
}
private void MoveSupportAssembly()
{
var supportAssembly = SupportAssembly();
if (File.Exists(supportAssembly))
File.Delete(supportAssembly);
using (var file = new FileStream(supportAssembly, FileMode.Create, FileAccess.Write))
Assembly.GetExecutingAssembly().GetManifestResourceStream(SupportAssemblyName).WriteTo(file);
}
private string SupportAssembly()
{
return Path.Combine(Path.GetDirectoryName(_unityEditor), SupportAssemblyName);
}
public static Patcher For(string unityLocation)
{
return new Patcher(unityLocation);
}
}
}