public class AssemblyLoader : AssemblyLoadContext
{
private const string NativeAssemblyInfix = ".ni";
-
private const string DllAssemblySuffix = ".dll";
-
private const string ExeAssemblySuffix = ".exe";
-
private const string NativeDllAssemblySuffix = NativeAssemblyInfix + DllAssemblySuffix;
-
- private static readonly string[] s_suffixes = new string[] { NativeDllAssemblySuffix, DllAssemblySuffix, ExeAssemblySuffix };
-
- private SortedSet<string> _dllDirectories = new SortedSet<string>();
- private SortedSet<string> _nativeDirectories = new SortedSet<string>();
-
- private HashSet<FileInfo> _assemblyCache = new HashSet<FileInfo>();
+ private static readonly string[] Suffixes = new string[] { NativeDllAssemblySuffix, DllAssemblySuffix, ExeAssemblySuffix };
+ private SortedSet<string> DllDirectoriesSet = new SortedSet<string>();
+ private SortedSet<string> NativeDirectoriesSet = new SortedSet<string>();
+ private HashSet<FileInfo> AssemblyCacheSet = new HashSet<FileInfo>();
public AssemblyLoader()
{
public IEnumerable<string> DllDirectories
{
- get { return _dllDirectories; }
+ get { return DllDirectoriesSet; }
}
public IEnumerable<string> NativeDirectories
{
- get { return _nativeDirectories; }
+ get { return NativeDirectoriesSet; }
}
public void AddSearchableDirectory(string directory)
{
if (Directory.Exists(directory))
{
- _dllDirectories.Add(directory);
- _nativeDirectories.Add(directory);
+ DllDirectoriesSet.Add(directory);
+ NativeDirectoriesSet.Add(directory);
foreach (var file in Directory.GetFiles(directory))
{
var info = new FileInfo(file);
- if (s_suffixes.Contains(info.Extension))
+ if (Suffixes.Contains(info.Extension))
{
- _assemblyCache.Add(info);
+ AssemblyCacheSet.Add(info);
}
}
}
public void RemoveSearchableDirectory(string directory)
{
- _dllDirectories.Remove(directory);
- _nativeDirectories.Remove(directory);
+ DllDirectoriesSet.Remove(directory);
+ NativeDirectoriesSet.Remove(directory);
- _assemblyCache.RemoveWhere(x => x.DirectoryName == directory);
+ AssemblyCacheSet.RemoveWhere(x => x.DirectoryName == directory);
}
public Assembly LoadFromPath(string path)
{
- if (0 == string.Compare(path, // strA
- path.Length - NativeDllAssemblySuffix.Length, // indexA
- NativeAssemblyInfix, // strB
- 0, // indexB
- NativeAssemblyInfix.Length, // length
- StringComparison.OrdinalIgnoreCase)) // options
+ if (string.Compare(path, path.Length - NativeDllAssemblySuffix.Length, NativeAssemblyInfix, 0, NativeAssemblyInfix.Length, StringComparison.OrdinalIgnoreCase) == 0)
{
return LoadFromNativeImagePath(path, null);
}
private Assembly Resolve(AssemblyName assemblyName)
{
- foreach (string suffix in s_suffixes)
+ foreach (string suffix in Suffixes)
{
- var info = _assemblyCache.FirstOrDefault(x => x.Name == assemblyName.Name + suffix);
+ var info = AssemblyCacheSet.FirstOrDefault(x => x.Name == assemblyName.Name + suffix);
if (info != null)
{