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

标签 c# serialization exception metaprogramming roslyn

我正在使用 StackExchange.Precompilation 在构建时执行一些 C# 语法转换。我希望能够在构建期间从我的 ICompileModule 抛出异常,并将这些输出输出到 Visual Studio 的输出窗口。

我创建了一个自定义异常类型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,其消息为“Type is not returned for member 'PrecompilationException...”,但是没有该 PrecompilationException 的详细信息,例如其消息或堆栈跟踪。

我是否在异常类中遗漏了一些对于正确序列化很重要的内容?有没有更好的方法让 StackExchange.Precompilation 记录错误?


更新 如果我将抛出的异常类型更改为 Exception 或 NotSupportedException 等标准类型,输出窗口将显示异常详细信息。但是,我仍然希望能够以这种方式使用自定义异常类型。

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

Type resolution error during ASP.NET precompilation

最佳答案

只需添加 DiagnosticBefore 中的 Diagnostics 集合/AfterCompileContext .

另一种选择是 MsBuild VS-Aware error message format 中的 Console.WriteLine

关于c# - 使用 `StackExchange.Precompilation` ,如何输出构建错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953114/

相关文章:

c# - 查询以包含挂起的插入

c# - 使用带有固定位置文本的 ScrollableControl 的自定义控件

c# - 如何最轻松地将带有字符串的 JSON 转换为带有数组的 JSON?

java - 为什么 readObject 和 writeObject 是私有(private)的,为什么我要显式地编写 transient 变量?

Python:图的断开组件中的所有最短路径

wpf - 错误模块名称 : PresentationFramework. ni.dll

java - 更新 Apache POI 4.0 后 - 无法识别属性 'http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit'

c# - 委托(delegate)不只是简写接口(interface)吗?

json - 将结构转换为 Json 的最佳方法是什么?

serialization - 序列化和编码(marshal)处理有什么区别?