2016-12-03 11 views
2

私はStackExchange.Precompilationを使用してビルド時にいくつかのC#構文変換を実行しています。ビルド中に私のICompileModuleから例外をスローし、その出力をVisual Studioの出力ウィンドウに表示したいと考えています。`StackExchange.Precompilation`を使用して、ビルドエラーをどのように出力できますか?

これらの構文変換中に発生するエラーを表すために、カスタム例外タイプPrecompilationExceptionを作成しました。ここに私の例外クラスではありません。これらの例外のいずれかがスローされ

[Serializable] 
public class PrecompilationException : Exception { 

    public PrecompilationException() : base() { } 

    public PrecompilationException(string message) : base(message) { } 

    public PrecompilationException(string message, Exception innerException) : base(message, innerException) { } 

    protected PrecompilationException(SerializationInfo info, StreamingContext context) : base(info, context) { } 
} 

は、出力ウィンドウには、そのメッセージSerializationException示し、「タイプはメンバーのために解決されていない「PrecompilationExceptionを...」が、ないありますそのメッセージまたはスタックトレースのようなPrecompilationExceptionの詳細。

私は例外クラスで適切なシリアル化を行うために重要なものを除外しましたか? StackExchange.Precompilationにエラーを記録する良い方法はありますか?


更新 私は、出力ウィンドウには、例外の詳細が表示されますExceptionまたはNotSupportedExceptionような何かの標準にスローされた例外の種類を変更した場合。しかし、私はまだこのようにカスタム例外の種類を使用できるようにしたいと思います。

更新2 この質問に対する答えは、私のカスタム例外タイプが機能していなかった理由を明らかにしています。基本的に、ASP.NETコンパイラはGACにないタイプのシリアル化に問題があります。

Type resolution error during ASP.NET precompilation

答えて

2

だけBefore/AfterCompileContextDiagnosticsコレクションにDiagnosticを追加します。

他の代替は、助けをMsBuild VS-Aware error message format

+0

おかげでConsole.WriteLineにあります。 'Diagnostic'を使うとビルドは警告を無視してエラーに失敗するようですが、出力やエラーリストのウィンドウには関連する情報はありません。フォーマットされた 'Console.WriteLine'アプローチはエラーリストウィンドウにエラー/警告を出しますが、' Microsoft.CodeAnalysis.Location'をそのフォーマットで必要な行/列番号に翻訳するのに問題があります。エラーリストに診断を出すために 'Precompilation'を得るために必要なことは何ですか?または、構文オブジェクトから行番号/列番号を簡単に取得する方法はありますか? – JamesFaix

+1

Diagnostic.ToString上のConsole.WriteLineは、正しい形式である必要があります。 – m0sa

+0

私は実際には 'DiagnosticDescriptor'を正しく初期化していませんでした。あなたが今提案したどちらのモードでも動作します。再度、感謝します! – JamesFaix

関連する問題