private static XDocument GetApiInfoDocument(string assembly, ApiInfoConfig config, out bool wasXml) { try { using (var stream = new MemoryStream()) { using (var writer = new StreamWriter(stream, new UTF8Encoding(false), 1024, true)) { ApiInfo.Generate(assembly, writer, config); } stream.Position = 0; wasXml = false; return(XDocument.Load(stream)); } } catch (BadImageFormatException) { } try { wasXml = true; return(XDocument.Load(assembly)); } catch (XmlException) { } throw new InvalidOperationException($"Unable to load {assembly} as it was neither a .NET assembly nor an XML API info file."); }
private Stream GenerateAssemblyApiInfo(Stream assemblyStream) { // try loading the file as an assembly, and then create the API info try { assemblyStream.Position = 0; var config = new ApiInfoConfig { IgnoreResolutionErrors = true }; var info = new MemoryStream(); using (var writer = new StreamWriter(info, UTF8NoBOM, DefaultSaveBufferSize, true)) { ApiInfo.Generate(assemblyStream, writer, config); } assemblyStream.Position = 0; info.Position = 0; return(info); } catch (BadImageFormatException) { } // try loading as an API info try { assemblyStream.Position = 0; var xdoc = XDocument.Load(assemblyStream); assemblyStream.Position = 0; return(assemblyStream); } catch (XmlException) { } throw new InvalidOperationException("Input was in an incorrect format."); }
private Stream GenerateAssemblyApiInfo(Stream assemblyStream) { var config = new ApiInfoConfig { IgnoreResolutionErrors = true }; var info = new MemoryStream(); using (var writer = new StreamWriter(info, UTF8NoBOM, DefaultSaveBufferSize, true)) { ApiInfo.Generate(assemblyStream, writer, config); } assemblyStream.Position = 0; info.Position = 0; return(info); }
protected override bool OnInvoke(IEnumerable <string> extras) { if (Program.Verbose) { Console.WriteLine($"Comparing the following assemblies:"); foreach (var assembly in Assemblies) { Console.WriteLine($" - {assembly}"); } if (Directories.Count > 0) { Console.WriteLine($"Using the following search diectories:"); foreach (var directory in Directories) { Console.WriteLine($" - {directory}"); } } } var infoStreams = new List <Stream>(); { var config = new ApiInfoConfig { IgnoreResolutionErrors = !alwaysResolve, SearchDirectories = Directories, }; foreach (var assembly in Assemblies) { if (Program.Verbose) { Console.WriteLine($"Generating API info for {assembly}..."); } var xdoc = GetApiInfoDocument(assembly, config, out var wasXml); if (!wasXml && outputApi) { xdoc.Save(assembly + ".api.xml"); } // in order to compare assemblies, they have to be the same name var xass = xdoc.Element("assemblies").Element("assembly"); xass.SetAttributeValue("name", "Assembly"); var stream = new MemoryStream(); xdoc.Save(stream); stream.Position = 0; infoStreams.Add(stream); } } GenerateDiff(xmlDiff, writer => { if (Program.Verbose) { Console.WriteLine($"Generating XML diff at {xmlDiff}..."); } infoStreams[0].Position = 0; infoStreams[1].Position = 0; ApiDiff.Generate(infoStreams[0], infoStreams[1], writer); }); GenerateDiff(htmlDiff, writer => { if (Program.Verbose) { Console.WriteLine($"Generating HTML diff at {htmlDiff}..."); } infoStreams[0].Position = 0; infoStreams[1].Position = 0; var config = new ApiDiffFormattedConfig { Colorize = true, Formatter = ApiDiffFormatter.Html, IgnoreNonbreaking = excludeNonbreaking, IgnoreParameterNameChanges = excludeParameterNames, }; ApiDiffFormatted.Generate(infoStreams[0], infoStreams[1], writer, config); }); GenerateDiff(mdDiff, writer => { if (Program.Verbose) { Console.WriteLine($"Generating Markdown diff at {mdDiff}..."); } infoStreams[0].Position = 0; infoStreams[1].Position = 0; var config = new ApiDiffFormattedConfig { Formatter = ApiDiffFormatter.Markdown, IgnoreNonbreaking = excludeNonbreaking, IgnoreParameterNameChanges = excludeParameterNames, }; ApiDiffFormatted.Generate(infoStreams[0], infoStreams[1], writer, config); }); return(true); }