forked from ClearFoundry/ClearScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAssemblyTable.cs
More file actions
126 lines (112 loc) · 4.4 KB
/
Copy pathAssemblyTable.cs
File metadata and controls
126 lines (112 loc) · 4.4 KB
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
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections.Concurrent;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.Win32;
namespace Microsoft.ClearScript.Util
{
internal static class AssemblyTable
{
private static ConcurrentDictionary<string, string> table;
static AssemblyTable()
{
LoadAssemblyTable();
if (table != null)
{
AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => table.TryAdd(args.LoadedAssembly.GetName().Name, args.LoadedAssembly.FullName);
AppDomain.CurrentDomain.GetAssemblies().ForEach(assembly => table.TryAdd(assembly.GetName().Name, assembly.FullName));
}
}
public static string GetFullAssemblyName(string name)
{
string fullName;
return ((table != null) && table.TryGetValue(name, out fullName)) ? fullName : name;
}
private static void LoadAssemblyTable()
{
// ReSharper disable EmptyGeneralCatchClause
string filePath = null;
try
{
var dirPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
if (!string.IsNullOrWhiteSpace(dirPath))
{
dirPath = Path.Combine(dirPath, "Microsoft", "ClearScript", Environment.Is64BitProcess ? "x64" : "x86", GetRuntimeVersionDirectoryName());
Directory.CreateDirectory(dirPath);
filePath = Path.Combine(dirPath, "AssemblyTable.bin");
if (File.Exists(filePath))
{
try
{
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var formatter = new BinaryFormatter();
table = (ConcurrentDictionary<string, string>)formatter.Deserialize(stream);
}
}
catch (Exception)
{
}
}
}
}
catch (Exception)
{
}
if (table == null)
{
BuildAssemblyTable();
if ((table != null) && (filePath != null))
{
try
{
using (var stream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, table);
}
}
catch (Exception)
{
}
}
}
// ReSharper restore EmptyGeneralCatchClause
}
private static void BuildAssemblyTable()
{
// ReSharper disable EmptyGeneralCatchClause
try
{
var key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\.NETFramework");
if (key != null)
{
var dirPath = Path.Combine((string)key.GetValue("InstallRoot"), GetRuntimeVersionDirectoryName());
table = new ConcurrentDictionary<string, string>();
foreach (var filePath in Directory.EnumerateFiles(dirPath, "*.dll", SearchOption.AllDirectories))
{
try
{
var assemblyName = Assembly.ReflectionOnlyLoadFrom(filePath).GetName();
table.TryAdd(assemblyName.Name, assemblyName.FullName);
}
catch (Exception)
{
}
}
}
}
catch (Exception)
{
}
// ReSharper restore EmptyGeneralCatchClause
}
private static string GetRuntimeVersionDirectoryName()
{
return MiscHelpers.FormatInvariant("v{0}", Environment.Version.ToString(3));
}
}
}