/// <summary> /// Reads the assembly from the given path, or else loads it from cache. /// </summary> /// <param name="path">The patch to read the assembly from.</param> /// <param name="readSymbols">Whether or not to read symbols.</param> /// <returns></returns> public AssemblyDefinition ReadAssembly(string path, bool readSymbols = false) { var fileInfo = new FileInfo(path); fileInfo.Refresh(); if (_cache.ContainsKey(path)) { if (DoesCacheMatch(fileInfo, _cache[path].Metadata)) { return _cache[path].Assembly; } } var defAssemblyResolver = new ExpandedAssemblyResolver(); defAssemblyResolver.AddSearchDirectory(Path.GetDirectoryName(path)); var rdrParams = new ReaderParameters() { AssemblyResolver = defAssemblyResolver, ReadSymbols = readSymbols }; var read = AssemblyDefinition.ReadAssembly(path, rdrParams); var assemblyResolver = read.MainModule.AssemblyResolver as BaseAssemblyResolver; //Cecil doesn't add the assembly's original directory as a search path by default. var dir = Path.GetDirectoryName(path); var entry = new AssemblyCacheEntry() { Assembly = read, Metadata = new FileMetadata() { Length = fileInfo.Length, LastWriteTime = fileInfo.LastWriteTimeUtc, CreationTime = fileInfo.CreationTimeUtc }, Path = path }; _cache[path] = entry; return read; }
/// <summary> /// Reads the assembly from the given path, or else loads it from cache. /// </summary> /// <param name="path">The patch to read the assembly from.</param> /// <param name="readSymbols">Whether or not to read symbols.</param> /// <returns></returns> public AssemblyDefinition ReadAssembly(string path, bool readSymbols = false) { var fileInfo = new FileInfo(path); fileInfo.Refresh(); if (_cache.ContainsKey(path)) { if (DoesCacheMatch(fileInfo, _cache[path].Metadata)) { return(_cache[path].Assembly); } } var defAssemblyResolver = new ExpandedAssemblyResolver(); defAssemblyResolver.AddSearchDirectory(Path.GetDirectoryName(path)); var rdrParams = new ReaderParameters() { AssemblyResolver = defAssemblyResolver, ReadSymbols = readSymbols }; var read = AssemblyDefinition.ReadAssembly(path, rdrParams); var assemblyResolver = read.MainModule.AssemblyResolver as BaseAssemblyResolver; //Cecil doesn't add the assembly's original directory as a search path by default. var dir = Path.GetDirectoryName(path); var entry = new AssemblyCacheEntry() { Assembly = read, Metadata = new FileMetadata() { Length = fileInfo.Length, LastWriteTime = fileInfo.LastWriteTimeUtc, CreationTime = fileInfo.CreationTimeUtc }, Path = path }; _cache[path] = entry; return(read); }