FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
scriptcs/src/ScriptCs.Core/AppDomainAssemblyResolver.cs at dev · scriptcs/scriptcs · GitHub
Uh oh!
There was an error while loading.
Please reload this page
.
scriptcs
/
scriptcs
Public
Notifications
You must be signed in to change notification settings
Fork
363
Star
2.5k
Code
Issues
167
Pull requests
2
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Issues
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
scriptcs
/
src
/
ScriptCs.Core
/
AppDomainAssemblyResolver.cs
Copy path
More file actions
More file actions
Latest commit
History
History
History
118 lines (100 loc) · 4.5 KB
Breadcrumbs
scriptcs
/
src
/
ScriptCs.Core
/
AppDomainAssemblyResolver.cs
Copy path
File metadata and controls
118 lines (100 loc) · 4.5 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
using
System
;
using
System
.
Collections
.
Generic
;
using
System
.
Reflection
;
using
ScriptCs
.
Contracts
;
using
System
.
IO
;
namespace
ScriptCs
{
public
class
AppDomainAssemblyResolver
:
IAppDomainAssemblyResolver
{
private
readonly
ILog
_logger
;
private
readonly
IFileSystem
_fileSystem
;
private
readonly
IAssemblyResolver
_resolver
;
private
readonly
IAssemblyUtility
_assemblyUtility
;
private
readonly
IDictionary
<
string
,
AssemblyInfo
>
_assemblyInfoMap
;
public
AppDomainAssemblyResolver
(
ILogProvider
logProvider
,
IFileSystem
fileSystem
,
IAssemblyResolver
resolver
,
IAssemblyUtility
assemblyUtility
,
IDictionary
<
string
,
AssemblyInfo
>
assemblyInfoMap
=
null
,
Func
<
object
,
ResolveEventArgs
,
Assembly
>
resolveHandler
=
null
)
{
Guard
.
AgainstNullArgument
(
"logProvider"
,
logProvider
)
;
Guard
.
AgainstNullArgument
(
"fileSystem"
,
fileSystem
)
;
Guard
.
AgainstNullArgument
(
"resolver"
,
resolver
)
;
Guard
.
AgainstNullArgument
(
"assemblyUtility"
,
assemblyUtility
)
;
_assemblyInfoMap
=
assemblyInfoMap
??
new
Dictionary
<
string
,
AssemblyInfo
>
(
)
;
_assemblyUtility
=
assemblyUtility
;
_logger
=
logProvider
.
ForCurrentType
(
)
;
_fileSystem
=
fileSystem
;
_resolver
=
resolver
;
if
(
resolveHandler
==
null
)
{
resolveHandler
=
AssemblyResolve
;
}
AppDomain
.
CurrentDomain
.
AssemblyResolve
+=
new
ResolveEventHandler
(
resolveHandler
)
;
}
internal
Assembly
AssemblyResolve
(
object
sender
,
ResolveEventArgs
args
)
{
AssemblyInfo
assemblyInfo
;
var
name
=
new
AssemblyName
(
args
.
Name
)
;
if
(
_assemblyInfoMap
.
TryGetValue
(
name
.
Name
,
out
assemblyInfo
)
)
{
lock
(
assemblyInfo
)
{
if
(
assemblyInfo
.
Assembly
==
null
)
{
assemblyInfo
.
Assembly
=
_assemblyUtility
.
LoadFile
(
assemblyInfo
.
Path
)
;
}
}
_logger
.
DebugFormat
(
"Resolving from: {0} to: {1}"
,
args
.
Name
,
assemblyInfo
.
Assembly
.
GetName
(
)
)
;
return
assemblyInfo
.
Assembly
;
}
return
null
;
}
public
void
Initialize
(
)
{
var
hostAssemblyPaths
=
_fileSystem
.
EnumerateBinaries
(
_fileSystem
.
HostBin
,
SearchOption
.
TopDirectoryOnly
)
;
AddAssemblyPaths
(
hostAssemblyPaths
)
;
var
globalPaths
=
_resolver
.
GetAssemblyPaths
(
_fileSystem
.
GlobalFolder
,
true
)
;
AddAssemblyPaths
(
globalPaths
)
;
var
scriptAssemblyPaths
=
_resolver
.
GetAssemblyPaths
(
_fileSystem
.
CurrentDirectory
,
true
)
;
AddAssemblyPaths
(
scriptAssemblyPaths
)
;
}
public
virtual
void
AddAssemblyPaths
(
IEnumerable
<
string
>
assemblyPaths
)
{
Guard
.
AgainstNullArgument
(
"assemblyPaths"
,
assemblyPaths
)
;
foreach
(
var
assemblyPath
in
assemblyPaths
)
{
if
(
_assemblyUtility
.
IsManagedAssembly
(
assemblyPath
)
)
{
var
info
=
new
AssemblyInfo
{
Path
=
assemblyPath
}
;
var
name
=
_assemblyUtility
.
GetAssemblyName
(
assemblyPath
)
;
info
.
Version
=
name
.
Version
;
AssemblyInfo
foundInfo
;
var
found
=
_assemblyInfoMap
.
TryGetValue
(
name
.
Name
,
out
foundInfo
)
;
if
(
!
found
||
foundInfo
.
Version
.
CompareTo
(
info
.
Version
)
<
0
)
{
// if the assembly being passed is a higher version
// and an assembly with it's name has already been resolved
if
(
found
&&
foundInfo
.
Assembly
!=
null
)
{
_logger
.
WarnFormat
(
"Conflict: Assembly {0} with version {1} cannot be added as it has already been resolved"
,
assemblyPath
,
info
.
Version
)
;
continue
;
}
_logger
.
DebugFormat
(
"Mapping Assembly {0} to version:{1}"
,
name
.
Name
,
name
.
Version
)
;
_assemblyInfoMap
[
name
.
Name
]
=
info
;
}
}
else
{
_logger
.
DebugFormat
(
"Skipping Mapping Native Assembly {0}"
,
assemblyPath
)
;
}
}
}
}
}
Back
|
FazBrowse Home
|
New Git URL