예제 #1
0
 public Uninstrumenter(
     DepsJsonUtils depsJsonUtils,
     IFileSystem fileSystem)
 {
     _depsJsonUtils = depsJsonUtils;
     _fileSystem    = fileSystem;
 }
예제 #2
0
        private void VisitAssemblyGroup(
            InstrumentationContext context,
            InstrumentationResult result,
            IEnumerable <FileInfo> groupFiles)
        {
            var firstAssemblyFile = groupFiles.First();

            var instrumentedAssembly = _assemblyInstrumenter.InstrumentAssembly(
                context,
                firstAssemblyFile);

            if (instrumentedAssembly == null)
            {
                return;
            }

            foreach (var assemblyFile in groupFiles)
            {
                var pdbFile            = FileUtils.GetPdbFile(assemblyFile);
                var assemblyBackupFile = FileUtils.GetBackupFile(assemblyFile);
                var pdbBackupFile      = FileUtils.GetBackupFile(pdbFile);

                //Backup
                File.Copy(assemblyFile.FullName, assemblyBackupFile.FullName, true);
                File.Copy(pdbFile.FullName, pdbBackupFile.FullName, true);

                //Override assembly
                File.Copy(instrumentedAssembly.TempAssemblyFile, assemblyFile.FullName, true);
                File.Copy(instrumentedAssembly.TempPdbFile, pdbFile.FullName, true);

                //Copy instrumentation dependencies
                var assemblyDirectory = assemblyFile.Directory;

                var hitServicesPath    = Path.GetFileName(hitServicesAssembly.Location);
                var newHitServicesPath = Path.Combine(assemblyDirectory.FullName, hitServicesPath);
                if (!File.Exists(newHitServicesPath))
                {
                    File.Copy(hitServicesAssembly.Location, newHitServicesPath, true);
                    result.AddExtraAssembly(newHitServicesPath);
                }

                instrumentedAssembly.AddLocation(
                    assemblyFile.FullName,
                    assemblyBackupFile.FullName,
                    pdbFile.FullName,
                    pdbBackupFile.FullName
                    );

                var hitServicesAssemblyVersion = FileVersionInfo.GetVersionInfo(hitServicesAssembly.Location);
                foreach (var depsJsonFile in assemblyDirectory.GetFiles("*.deps.json"))
                {
                    DepsJsonUtils.PatchDepsJson(depsJsonFile, hitServicesAssemblyVersion.ProductVersion);
                }
            }

            result.AddInstrumentedAssembly(instrumentedAssembly);

            File.Delete(instrumentedAssembly.TempAssemblyFile);
            File.Delete(instrumentedAssembly.TempPdbFile);
        }
예제 #3
0
        public static void Execute(InstrumentationResult result)
        {
            foreach (var assembly in result.Assemblies)
            {
                foreach (var assemblyLocation in assembly.Locations)
                {
                    if (File.Exists(assemblyLocation.BackupFile))
                    {
                        File.Copy(assemblyLocation.BackupFile, assemblyLocation.File, true);
                        File.Delete(assemblyLocation.BackupFile);
                    }

                    if (File.Exists(assemblyLocation.BackupPdbFile))
                    {
                        File.Copy(assemblyLocation.BackupPdbFile, assemblyLocation.PdbFile, true);
                        File.Delete(assemblyLocation.BackupPdbFile);
                    }

                    var assemblyDirectory = Path.GetDirectoryName(assemblyLocation.File);
                    foreach (var depsJsonFile in Directory.GetFiles(assemblyDirectory, "*.deps.json"))
                    {
                        DepsJsonUtils.UnpatchDepsJson(depsJsonFile);
                    }
                }
            }

            foreach (var extraAssembly in result.ExtraAssemblies)
            {
                if (File.Exists(extraAssembly))
                {
                    File.Delete(extraAssembly);
                }
            }
        }
예제 #4
0
        public CustomAssemblyResolver(DirectoryInfo assemblyDirectory, ILogger logger)
        {
            _logger = logger;

            foreach (var searchDirectory in GetSearchDirectories())
            {
                RemoveSearchDirectory(searchDirectory);
            }

            AddSearchDirectory(assemblyDirectory.FullName);

            _dependencyContext = DepsJsonUtils.LoadDependencyContext(assemblyDirectory);

            var runtimeConfigPath = assemblyDirectory.GetFiles("*.runtimeconfig.dev.json", SearchOption.TopDirectoryOnly)
                                    .Concat(assemblyDirectory.GetFiles("*.runtimeconfig.json", SearchOption.TopDirectoryOnly))
                                    .FirstOrDefault();

            if (runtimeConfigPath != null)
            {
                var runtimeConfigContent = File.ReadAllText(runtimeConfigPath.FullName);
                foreach (var path in DepsJsonUtils.GetAdditionalPaths(runtimeConfigContent))
                {
                    AddSearchDirectory(path);
                }
            }
        }
예제 #5
0
        public void ShouldPatchDepsJson()
        {
            var originalContent = GetOriginalDepsJsonContent();
            var expectedResult  = GetPatchedDepsJsonContent();
            var result          = DepsJsonUtils.PatchDepsJsonContent(originalContent, "1.0.0");

            NormalizeLineEnding(result).ShouldBe(NormalizeLineEnding(expectedResult));
        }
예제 #6
0
        public void ShouldUnpatchDepsJson()
        {
            var patchedContent = GetPatchedDepsJsonContent();
            var expectedResult = GetOriginalDepsJsonContent();
            var result         = DepsJsonUtils.UnpatchDepsJsonContent(patchedContent);

            NormalizeLineEnding(result).ShouldBe(NormalizeLineEnding(expectedResult));
        }
예제 #7
0
 public Instrumenter(
     ILogger <Instrumenter> logger,
     AssemblyInstrumenter assemblyInstrumenter,
     DepsJsonUtils depsJsonUtils)
 {
     _logger = logger;
     _assemblyInstrumenter = assemblyInstrumenter;
     _depsJsonUtils        = depsJsonUtils;
 }
예제 #8
0
        private void VisitAssemblyGroup(IEnumerable <string> assemblyFiles)
        {
            var firstAssemblyFile = assemblyFiles.First();

            var instrumentedAssembly = InstrumentAssemblyIfNecessary(firstAssemblyFile);

            if (instrumentedAssembly == null)
            {
                return;
            }

            foreach (var assemblyFile in assemblyFiles)
            {
                var pdbFile            = GetPdbFile(assemblyFile);
                var assemblyBackupFile = GetBackupFile(assemblyFile);
                var pdbBackupFile      = GetBackupFile(pdbFile);

                //Backup
                File.Copy(assemblyFile, assemblyBackupFile, true);
                File.Copy(pdbFile, pdbBackupFile, true);

                //Override assembly
                File.Copy(instrumentedAssembly.TempAssemblyFile, assemblyFile, true);
                File.Copy(instrumentedAssembly.TempPdbFile, pdbFile, true);

                //Copy instrumentation dependencies
                var assemblyDirectory = Path.GetDirectoryName(assemblyFile);

                foreach (var dependencyPath in instrumentationDependencies)
                {
                    var dependencyAssemblyName = Path.GetFileName(dependencyPath);
                    var newDependencyPath      = Path.Combine(assemblyDirectory, dependencyAssemblyName);
                    File.Copy(dependencyPath, newDependencyPath, true);
                    result.AddExtraAssembly(newDependencyPath);
                }

                instrumentedAssembly.AddLocation(
                    Path.GetFullPath(assemblyFile),
                    Path.GetFullPath(assemblyBackupFile),
                    Path.GetFullPath(pdbFile),
                    Path.GetFullPath(pdbBackupFile)
                    );

                foreach (var depsJsonFile in Directory.GetFiles(assemblyDirectory, "*.deps.json"))
                {
                    DepsJsonUtils.PatchDepsJson(depsJsonFile);
                }
            }

            result.AddInstrumentedAssembly(instrumentedAssembly);

            File.Delete(instrumentedAssembly.TempAssemblyFile);
            File.Delete(instrumentedAssembly.TempPdbFile);
        }
        public static AssemblyDefinition ToDefinition(this Assembly assembly)
        {
            var assemblyFile     = _fileSystem.FileInfo.FromFileName(assembly.Location);
            var depsJsonUtils    = new DepsJsonUtils(new FileSystem());
            var resolver         = new CustomAssemblyResolver(assemblyFile.Directory, NullLogger <CustomAssemblyResolver> .Instance, depsJsonUtils);
            var readerParameters = new ReaderParameters {
                ReadSymbols = true, AssemblyResolver = resolver
            };

            return(AssemblyDefinition.ReadAssembly(assemblyFile.FullName, readerParameters));
        }
예제 #10
0
 public Instrumenter(
     IAssemblyInstrumenter assemblyInstrumenter,
     DepsJsonUtils depsJsonUtils,
     IFileSystem fileSystem,
     ILogger <Instrumenter> logger)
 {
     _assemblyInstrumenter = assemblyInstrumenter;
     _depsJsonUtils        = depsJsonUtils;
     _fileSystem           = fileSystem;
     _logger = logger;
 }
예제 #11
0
 public AssemblyInstrumenter(
     TypeInstrumenter typeInstrumenter,
     ILogger <AssemblyInstrumenter> logger,
     ILogger <CustomAssemblyResolver> assemblyResolverLogger,
     DepsJsonUtils depsJsonUtils,
     IFileSystem fileSystem)
 {
     _typeInstrumenter       = typeInstrumenter;
     _logger                 = logger;
     _assemblyResolverLogger = assemblyResolverLogger;
     _depsJsonUtils          = depsJsonUtils;
     _fileSystem             = fileSystem;
 }
예제 #12
0
        public void GetAdditionalPaths_RuntimeConfigContext_PathsReturned()
        {
            var runtimeConfigContent = @"{
  ""runtimeOptions"": {
    ""additionalProbingPaths"": [
      ""/root/.dotnet/store/|arch|/|tfm|"",
      ""/api/.nuget/packages"",
      ""/usr/share/dotnet/sdk/NuGetFallbackFolder""
    ]
    }
}";

            var result = DepsJsonUtils.GetAdditionalPaths(runtimeConfigContent);

            result.Should().NotBeEmpty();
            result.Count.Should().Be(2);
            result.Should().Contain("/api/.nuget/packages");
            result.Should().Contain("/usr/share/dotnet/sdk/NuGetFallbackFolder");
        }
예제 #13
0
        public CustomAssemblyResolver(string assemblyDirectory)
        {
            RemoveSearchDirectory(".");
            RemoveSearchDirectory("bin");

            AddSearchDirectory(assemblyDirectory);

            _dependencyContext = DepsJsonUtils.LoadDependencyContext(assemblyDirectory);

            var runtimeConfigPath = Directory.GetFiles(assemblyDirectory, "*.runtimeconfig.dev.json", SearchOption.TopDirectoryOnly)
                                    .FirstOrDefault();

            if (runtimeConfigPath != null)
            {
                var runtimeConfigContent = File.ReadAllText(runtimeConfigPath);
                foreach (var path in DepsJsonUtils.GetAdditionalPaths(runtimeConfigContent))
                {
                    AddSearchDirectory(path);
                }
            }
        }
예제 #14
0
        public void GetAdditionalPaths_EmptyObject_NoError()
        {
            var result = DepsJsonUtils.GetAdditionalPaths(@"{}");

            result.Should().BeEmpty();
        }
예제 #15
0
        public void GetAdditionalPaths_EmptyRuntimeConfigContext_NoError()
        {
            var result = DepsJsonUtils.GetAdditionalPaths(string.Empty);

            result.Should().BeEmpty();
        }
예제 #16
0
        public DepsJsonUtilsTests()
        {
            _mockFileSystem = new MockFileSystem();

            _sut = new DepsJsonUtils(_mockFileSystem);
        }
예제 #17
0
        private void VisitAssemblyGroup(
            InstrumentationContext context,
            InstrumentationResult result,
            IEnumerable <FileInfo> assemblyFiles)
        {
            using (_logger.BeginScope("Checking assembly files {assemblies}", assemblyFiles.Select(f => f.FullName), LogLevel.Information))
            {
                var instrumentedAssembly = _assemblyInstrumenter.InstrumentAssemblyFile(
                    context,
                    assemblyFiles.First());

                if (instrumentedAssembly == null)
                {
                    return;
                }

                foreach (var assemblyFile in assemblyFiles)
                {
                    if (_loadedAssemblyFiles.Contains(assemblyFile.FullName))
                    {
                        _logger.LogInformation("Skipping loaded assembly {assemblyFile}", assemblyFile.FullName);
                        continue;
                    }

                    var pdbFile            = FileUtils.GetPdbFile(assemblyFile);
                    var assemblyBackupFile = FileUtils.GetBackupFile(assemblyFile);
                    var pdbBackupFile      = FileUtils.GetBackupFile(pdbFile);

                    //Backup
                    File.Copy(assemblyFile.FullName, assemblyBackupFile.FullName, true);
                    File.Copy(pdbFile.FullName, pdbBackupFile.FullName, true);

                    //Override assembly
                    File.Copy(instrumentedAssembly.TempAssemblyFile, assemblyFile.FullName, true);
                    File.Copy(instrumentedAssembly.TempPdbFile, pdbFile.FullName, true);

                    //Copy instrumentation dependencies
                    var assemblyDirectory = assemblyFile.Directory;

                    var hitServicesPath    = Path.GetFileName(hitServicesAssembly.Location);
                    var newHitServicesPath = Path.Combine(assemblyDirectory.FullName, hitServicesPath);
                    File.Copy(hitServicesAssembly.Location, newHitServicesPath, true);
                    result.AddExtraAssembly(newHitServicesPath);

                    instrumentedAssembly.AddLocation(
                        assemblyFile.FullName,
                        assemblyBackupFile.FullName,
                        pdbFile.FullName,
                        pdbBackupFile.FullName
                        );

                    var hitServicesAssemblyVersion = FileVersionInfo.GetVersionInfo(hitServicesAssembly.Location);
                    foreach (var depsJsonFile in assemblyDirectory.GetFiles("*.deps.json"))
                    {
                        DepsJsonUtils.PatchDepsJson(depsJsonFile, hitServicesAssemblyVersion.ProductVersion);
                    }
                }

                result.AddInstrumentedAssembly(instrumentedAssembly);

                File.Delete(instrumentedAssembly.TempAssemblyFile);
                File.Delete(instrumentedAssembly.TempPdbFile);
            }
        }