16

バックグラウンド

私は他の会社に販売される予定の小さなコーディングプロジェクトに取り組んでいます。そのためのドキュメントを作成する必要があったので、Sandcastleを使用することにしました。ダウンロードとインストールに非常に長い時間がかかった後、ようやく動作するようになり、コメントのないパブリックメソッドまたはクラスにコメントがないことを示す赤いテキストが表示されていることに気付きました。次に、コメントを高速化するためにGhostdocをインストールしました。これにより、xmlコメントが欠落しているというコンパイラの警告がオンになりました。これは、コメントする必要のあるすべてのリストができたので、すばらしいことでした。

問題

私のコードファイルの1つは自動生成されたファイルで、約3000のコンパイラ警告が含まれています。「MissingXmlComment」コンパイラ警告の作成からそのファイルをスキップできるようにする必要があります。私はこの投稿からこれらのことを知っています:

  • プロジェクトのコンパイラ警告をオフにできることはわかっていますが、プロジェクトにはコンパイラ警告が必要な他のファイルがあります。
  • コンパイラの警告を削除するために使用できることはわかって#pragma warning disable 1591いますが、ファイルは自動生成されるため、毎回手動で再追加する必要はありません。
  • 空のコメントを追加できることはわかっていますが、ファイルが再生成されるたびにコメントを再追加する必要はありません。
  • 名前空間内の唯一のクラスであるため、ファイルを独自のプロジェクトにプルして、XMLコメント要件を削除することもできますが、顧客が別のdllを処理する必要はありません。
  • クラスは部分クラスであるため、部分クラスに#pragma警告無効化を追加する方法を探すことを考えていましたが、それが可能であったとしても、警告をスローする列挙型がまだあります。

特定の種類の警告に対して単一のファイルを無視するようにVSに指示するにはどうすればよいですか?

4

3 に答える 3

3

いくつかの可能性が思い浮かびます。

  1. 自動生成された.csファイルをインポートする別のクラスを作成できますか?ラッピングクラスにはプラグマがあり、自動生成されたクラスをインポートするだけです。
  2. ファイルが生成された後、.csファイルがコンパイルされる前に、ビルドイベントとして呼び出されるperlスクリプト(または単純なC#プログラム)を記述します。
于 2012-07-12T03:34:59.563 に答える
3

生成されたクラスがユーザーに表示されないようにする必要がある場合は、生成ツールにクラスをパブリックではなく内部として生成するオプションがあるかどうかを確認できます。

生成されたコードが Web サービス参照である場合、参照を作成するときにこれを指定するオプションがあります ([サービス参照の追加] ダイアログで、[詳細設定] -> [生成されたクラスのアクセス レベル])。

それ以外の場合は、生成されたコード内の型のアクセス レベルを public から internal に自動的に変更する方法を見つけることができます。

于 2012-07-12T07:00:29.313 に答える
1

編集:私の解決策

David Thielenの提案を使用して、自動生成された#pragma warning disableファイルにメッセージを挿入するC#プログラムを作成しました。理想的には、ファイル自体の生成に対する事後操作と呼びますが、今のところ、私のステートメントはファイルの最初の行の1つであるため、プリコンパイルコマンドで十分です。行、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);
        }
    }
}
于 2012-11-05T18:38:29.287 に答える