Ejemplo n.º 1
0
        /// <summary>
        /// Modifies a given assembly prior to being loaded from disk.
        /// </summary>
        /// <param name="assemblyFile">The filename of the target assembly.</param>
        /// <returns>A valid assembly.</returns>
        public override Assembly Load(string assemblyFile)
        {
            var targetAssembly = AssemblyFactory.GetAssembly(assemblyFile);

            // Strongly-named assemblies cannot be modified
            if (targetAssembly.Name.HasPublicKey)
            {
                return(base.Load(assemblyFile));
            }

            var assemblyFileName = Path.GetFileNameWithoutExtension(assemblyFile);

            string pdbFile    = string.Format("{0}.pdb", assemblyFileName);
            bool   hasSymbols = File.Exists(pdbFile);

            if (PdbLoader != null && hasSymbols)
            {
                PdbLoader.LoadSymbols(targetAssembly);
            }

            foreach (var action in AssemblyWeavers)
            {
                action(targetAssembly);

                // Verify the assembly at every step
                if (AssemblyVerifier == null)
                {
                    continue;
                }

                AssemblyVerifier.Verify(targetAssembly);
            }

            var memoryStream = new MemoryStream();

            if (PdbLoader != null && hasSymbols)
            {
                PdbLoader.SaveSymbols(targetAssembly);
            }

            // Save the modifed assembly
            AssemblyFactory.SaveAssembly(targetAssembly, memoryStream);

            if (PdbLoader == null || !hasSymbols)
            {
                return(targetAssembly.ToAssembly());
            }

            var pdbBytes = File.ReadAllBytes(pdbFile);

            return(PdbLoader.LoadAssembly(memoryStream.ToArray(), pdbBytes));
        }