Esempio n. 1
0
        // Returns output path of assembly
        public static string CompileAssemblyFromSourceDir(string fixtureName, string assemblyName, string sourceDir, bool generateExecutable = false, params string[] references)
        {
            var sourceFiles = SourceFilesIn(sourceDir);
            var cacheInfo   = new CachedAssemblyInfo(sourceFiles, references);

            var cacheKey       = AssemblyCache.GetCacheKey(fixtureName, assemblyName, cacheInfo);
            var outputAssembly = cacheKey + (generateExecutable ? ".exe" : ".dll");

            if (AssemblyCache.CheckCachedAssembly(fixtureName, assemblyName, cacheInfo))
            {
                var cachedCompilerOutput = File.ReadAllText(cacheKey + ".compilerOutput");
                Console.WriteLine("// Using cached assembly '{0}'. Original compiler output follows:", Path.GetFileName(Path.GetDirectoryName(cacheKey)));
                Console.WriteLine(cachedCompilerOutput);
                return(outputAssembly);
            }

            var compilerOutput = Compile(outputAssembly, sourceFiles, generateExecutable, references);

            File.WriteAllText(cacheKey + ".compilerOutput", compilerOutput);
            Console.WriteLine(compilerOutput);

            AssemblyCache.SaveCachedAssembly(fixtureName, assemblyName, cacheInfo);

            return(outputAssembly);
        }
Esempio n. 2
0
        private static void XmlWrite(string path, CachedAssemblyInfo info)
        {
            var serializer = new XmlSerializer(info.GetType());

            using (var s = File.Open(path, FileMode.Create, FileAccess.Write))
                serializer.Serialize(s, info);
        }
Esempio n. 3
0
        // Returns output path of assembly
        public static string CompileAssemblyFromSourceDir(string fixtureName, string assemblyName, string sourceDir, bool generateExecutable = false, params string[] references)
        {
            var sourceFiles = SourceFilesIn(sourceDir);
            var cacheInfo = new CachedAssemblyInfo(sourceFiles, references);

            var cacheKey = AssemblyCache.GetCacheKey(fixtureName, assemblyName, cacheInfo);
            var outputAssembly = cacheKey + (generateExecutable ? ".exe" : ".dll");

            if (AssemblyCache.CheckCachedAssembly(fixtureName, assemblyName, cacheInfo))
            {
                var cachedCompilerOutput = File.ReadAllText(cacheKey + ".compilerOutput");
                Console.WriteLine("// Using cached assembly '{0}'. Original compiler output follows:", Path.GetFileName(Path.GetDirectoryName(cacheKey)));
                Console.WriteLine(cachedCompilerOutput);
                return outputAssembly;
            }

            var compilerOutput = Compile(outputAssembly, sourceFiles, generateExecutable, references);

            File.WriteAllText(cacheKey + ".compilerOutput", compilerOutput);
            Console.WriteLine(compilerOutput);

            AssemblyCache.SaveCachedAssembly(fixtureName, assemblyName, cacheInfo);

            return outputAssembly;
        }
Esempio n. 4
0
 public static bool CheckCachedAssembly(string fixtureName, string assemblyName, CachedAssemblyInfo info)
 {
     var xmlPath = XmlCachePathFor(fixtureName, assemblyName, info);
     if (!File.Exists(xmlPath))
         return false;
     var cached = XmlRead(xmlPath);
     return info.Equals(cached);
 }
Esempio n. 5
0
        public static string GetCacheKey(string fixtureName, string assemblyName, CachedAssemblyInfo info)
        {
            var cacheFolder = GetCacheFolder(fixtureName);

            var infoText = info.ToString();
            var infoMD5  = MD5String(infoText);

            var subFolder = Path.Combine(cacheFolder, infoMD5);

            Directory.CreateDirectory(subFolder);

            var assemblyNameShort = Path.GetFileNameWithoutExtension(assemblyName);

            return(Path.Combine(subFolder, assemblyNameShort));
        }
Esempio n. 6
0
        // Checks to see if the output path and source files all match exactly.
        // Note that the actual output isn't compared.
        public bool Equals(CachedAssemblyInfo rhs)
        {
            if ((References == null) || (rhs.References == null))
            {
                return(false);
            }
            if ((SourceFiles == null) || (rhs.SourceFiles == null))
            {
                return(false);
            }

            return(SourceFiles.Length == rhs.SourceFiles.Length &&
                   SourceFiles.OrderBy(sf => sf.Path)
                   .SequenceEqual(rhs.SourceFiles.OrderBy(sf => sf.Path)) &&
                   References.Length == rhs.References.Length &&
                   References.OrderBy(r => r)
                   .SequenceEqual(rhs.References.OrderBy(r => r)));
        }
Esempio n. 7
0
        public static string GetCacheKey(string fixtureName, string assemblyName, CachedAssemblyInfo info)
        {
            var cacheFolder = GetCacheFolder(fixtureName);

            var infoText = info.ToString();
            var infoMD5 = MD5String(infoText);

            var subFolder = Path.Combine(cacheFolder, infoMD5);
            Directory.CreateDirectory(subFolder);

            var assemblyNameShort = Path.GetFileNameWithoutExtension(assemblyName);
            return Path.Combine(subFolder, assemblyNameShort);
        }
Esempio n. 8
0
        // Checks to see if the output path and source files all match exactly.
        // Note that the actual output isn't compared.
        public bool Equals(CachedAssemblyInfo rhs)
        {
            if ((References == null) || (rhs.References == null))
                return false;
            if ((SourceFiles == null) || (rhs.SourceFiles == null))
                return false;

            return SourceFiles.Length == rhs.SourceFiles.Length
                && SourceFiles.OrderBy(sf => sf.Path)
                    .SequenceEqual(rhs.SourceFiles.OrderBy(sf => sf.Path))
                && References.Length == rhs.References.Length
                && References.OrderBy(r => r)
                    .SequenceEqual(rhs.References.OrderBy(r => r));
        }
Esempio n. 9
0
 private static void XmlWrite(string path, CachedAssemblyInfo info)
 {
     var serializer = new XmlSerializer(info.GetType());
     using (var s = File.Open(path, FileMode.Create, FileAccess.Write))
         serializer.Serialize(s, info);
 }
Esempio n. 10
0
 private static string XmlCachePathFor(string fixtureName, string assemblyName, CachedAssemblyInfo info)
 {
     return GetCacheKey(fixtureName, assemblyName, info) + ".xml";
 }
Esempio n. 11
0
 public static void SaveCachedAssembly(string fixtureName, string assemblyName, CachedAssemblyInfo info)
 {
     var xmlPath = XmlCachePathFor(fixtureName, assemblyName, info);
     XmlWrite(xmlPath, info);
 }
Esempio n. 12
0
 private static string XmlCachePathFor(string fixtureName, string assemblyName, CachedAssemblyInfo info)
 {
     return(GetCacheKey(fixtureName, assemblyName, info) + ".xml");
 }
Esempio n. 13
0
        public static void SaveCachedAssembly(string fixtureName, string assemblyName, CachedAssemblyInfo info)
        {
            var xmlPath = XmlCachePathFor(fixtureName, assemblyName, info);

            XmlWrite(xmlPath, info);
        }
Esempio n. 14
0
        public static bool CheckCachedAssembly(string fixtureName, string assemblyName, CachedAssemblyInfo info)
        {
            var xmlPath = XmlCachePathFor(fixtureName, assemblyName, info);

            if (!File.Exists(xmlPath))
            {
                return(false);
            }
            var cached = XmlRead(xmlPath);

            return(info.Equals(cached));
        }