背景
我的工作是将要被出售给其他公司的一个小项目编码。 我需要为它创建一些文件,所以我决定用沙堡。 采取远长下载并安装后,我终于得到了它的工作,并注意到没有评论任何公开的方法或类有红色文字说明该评论不见了。 然后我装Ghostdoc,以加快我的评论。 这开启了编译器警告缺少XML注释,这是伟大的,因为我现在拥有的一切的,我需要评论的列表。
问题
我的一个代码文件是自动生成的文件,其中包含约3000编译器警告。 我需要能够从产生任何“缺少XML注释”编译器警告跳过该文件。 我知道这些东西该职位:
- 我知道我可以关闭编译器项目的警告,但也有应该有编译器警告该项目的其他文件。
- 我知道我可以使用
#pragma warning disable 1591
删除编译器警告,但文件是自动生成的,我真的不希望有手动,每次重新添加。 - 我知道我可以添加一个空的评论,但再一次,我真的不希望有重新添加每次文件被再生一次。
- 我可以拉出来的文件到它自己的项目,因为它是唯一的类它的命名空间,然后删除XML注释的要求,但我不希望客户不得不面对另一个DLL。
- 这些类是局部类,所以我在想试图找到一种方式来添加的#pragma警告禁止在部分类,但即使这是可能的,仍然有将抛出警告枚举。
我怎么能告诉VS忽略特定类型警告的单个文件?
如果生成的类不应该是你的用户不可见,你可以检查生成工具有一个选项,以生成类内部,而不是公众。
如果您生成的代码是一个Web服务的参考,当您创建( - 为生成的类>访问级别中的“添加服务引用”对话框中,高级)参考必须指定此选项。
否则,你可以尝试找到一种方法来自动生成的代码类型的访问级别从公共更改为内部。
编辑:我的解决办法
我用大卫·蒂伦的建议,并创造了插入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);
}
}
}