使用`StackExchange.Precompilation`,我如何输出构建错误?

问题描述:

我正在使用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来记录错误?


更新 如果我改变异常类型是扔的东西像标准或ExceptionNotSupportedException输出窗口会显示异常的详细信息。但是,我仍然希望能够以这种方式使用自定义的异常类型。

Update2 这个问题的答案揭示了为什么我的自定义异常类型不工作。基本上,ASP.NET编译器在序列化不在GAC中的类型时遇到问题。

Type resolution error during ASP.NET precompilation

Before/AfterCompileContext只需添加一个DiagnosticDiagnostics集合。

的另一种方法是Console.WriteLineMsBuild VS-Aware error message format

+0

感谢您的帮助。如果我使用'Diagnostic',构建似乎忽略警告并且错误失败,但输出或错误列表窗口中没有任何相关信息。格式化的'Console.WriteLine'方法向错误列表窗口发出错误/警告,但我无法将'Microsoft.CodeAnalysis.Location'转换为该格式所需的行/列号。有什么特别的我需要做'得到'预编译'发出诊断到错误列表?或者,有没有办法从语法对象中轻松获取行/列号? – JamesFaix

+1

Diagnostic.ToString上的Console.WriteLine应该使用正确的格式 – m0sa

+0

我实际上并没有初始化我的'DiagnosticDescriptor'属性。它适用于您现在建议的任一模式。再次感谢! – JamesFaix