Dar*_*ryl 15 c# sandcastle .net-4.0 visual-studio-2010
我正在开发一个小型编码项目,该项目将被出售给其他公司.我需要为它创建一些文档,所以我决定使用Sandcastle.经过很长时间的下载和安装后,我终于开始工作,并注意到任何没有评论的公共方法或类都有红色文本说明评论缺失.然后我安装了Ghostdoc来帮助加快我的评论速度.这打开了编译器警告缺少xml注释,这很好,因为我现在有一个我需要评论的所有内容的列表.
我的一个代码文件是一个自动生成的文件,其中包含大约3000个编译器警告.我需要能够跳过该文件来创建任何"Missing Xml Comment"编译器警告.我从这篇文章中了解到这些:
#pragma warning disable 1591
用来删除编译器警告,但文件是自动生成的,我真的不想每次都要手动重新添加它.如何告诉VS忽略特定类型警告的单个文件?
我采用了 David Thielen 的建议并创建了一个 C# 程序,将#pragma warning disable
消息插入到我的自动生成的文件中。理想情况下,我将其称为生成文件本身的后操作,但现在预编译命令就足够了,因为我的语句将是文件中的第一行之一,它只需读取几行行,查看禁用语句已经存在,然后退出,因此它不会减慢构建速度。下面是我的节目,供大家欣赏!:)
/// <summary>
/// Addes #pragma warning disable messages to source code as part of a prebuild to ignore warnings.
/// Primarly used for autogenerated classes that may contain some compiler warnings by default
/// </summary>
public class Program
{
/// <summary>
///
/// </summary>
/// <param name="args">
/// [0] - file to edit
/// [1] - line number to insert / edit warning disable at
/// [2+] - warnings numbers to disable</param>
static void Main(string[] args)
{
// Preconditions
if (args.Length < 2)
{
throw new ArgumentException(String.Format("Unexpected number of parameters.{0}Parameters should be [0] - file to edit{0}[1] - line number to insert / edit warning disable at{0}[2+] - warnings numbers to disable", Environment.NewLine));
}
else if (args.Length == 2) { return; }
// Valid number of args, validate arguments
string filePath = args[0];
long lineNumber;
if(!long.TryParse(args[1], out lineNumber)){
throw new InvalidCastException("Unable to cast \"" + args[1] + "\" to a long");
}
string[] compilerWarningNumbers = new string[args.Length - 2];
Array.ConstrainedCopy(args, 2, compilerWarningNumbers, 0, compilerWarningNumbers.Length);
// File Name and line number are valid, perform search and replace
AddOrUpdateCompilerWarningDisabler(filePath, lineNumber, String.Join(",", compilerWarningNumbers));
}
private const string TEMP_FILE_POSTFIX = ".CompilerWarningDisabler.txt";
public static void AddOrUpdateCompilerWarningDisabler(string filePath, long lineNumber, string compilerWarningNumberCSV)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException("File path not found!", filePath);
}
// Set Clear Readonly Flag
FileInfo fileInfo = new FileInfo(filePath);
bool isReadOnly = fileInfo.IsReadOnly;
// Get Temp File Name and Delete if it already exists
string tempFile = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + TEMP_FILE_POSTFIX);
File.Delete(tempFile);
// Read from the target file and write to a new file.
int currentLine = 1;
string line;
string textToWrite = "#pragma warning disable " + compilerWarningNumberCSV;
try
{
using (StreamReader reader = new StreamReader(filePath))
using (StreamWriter writer = new StreamWriter(tempFile))
{
while ((line = reader.ReadLine()) != null)
{
if (currentLine == lineNumber)
{
if (line.StartsWith("#pragma warning disable"))
{
if (line == textToWrite)
{
// Nothing has changed, don't bother copying file
return;
}
else
{
line = textToWrite;
}
}
else
{
writer.WriteLine(textToWrite);
writer.WriteLine(line);
}
}
else
{
writer.WriteLine(line);
}
currentLine++;
}
if (currentLine == lineNumber)
{
writer.WriteLine(textToWrite);
}
if (currentLine < lineNumber)
{
throw new InvalidDataException("File " + filePath + " does not contain line number " + lineNumber);
}
}
// This could potentially delete the source file, but this should be messing with autogenerated files, so even if it does happen, it shouldn't be to hard to get it back
if (isReadOnly)
{
fileInfo.IsReadOnly = false;
}
File.Delete(filePath);
File.Move(tempFile, filePath);
if (isReadOnly)
{
new FileInfo(filePath).IsReadOnly = true;
}
}
finally
{
File.Delete(tempFile);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6268 次 |
最近记录: |