编辑:我的解决方案
我使用了 David Thielen 的建议并创建了一个 C# 程序,将#pragma warning disable
消息插入到我的自动生成的文件中。理想情况下,我将其称为生成文件本身的后期操作,但现在预编译命令就足够了,因为我的语句将是文件中的第一行之一,它只需要读取几行行,看到 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);
}
}
}