古老的问题,但如果你没有定义默认监听器,它将不会像往常一样显示消息对话框。我还没有确认它是否真的发生了火灾并被吃掉(我怀疑是这种情况),还是根本没有发火。
但无论如何它不会显示对话框。
从文档为DefaultTraceListener
为断言和Fail方法消息框的显示调用 依赖于DefaultTraceListener的存在。如果 DefaultTraceListener不在Listeners集合中,则不会显示消息 。
的DefaultTraceListener可由 元件被除去,由该元件,或者通过调用监听属性 清除 方法(System.Diagnostics.Trace.Listeners.Clear())。
您可以检查你的听众,并通过使用像下面的一些代码获取类型:
var listeners = new TraceListener[Debug.Listeners.Count];
Debug.Listeners.CopyTo(listeners, 0);
foreach (var listener in listeners) {
Debug.WriteLine("Name : {0} of type : {1}", listener.Name, listener.GetType());
}
如果你没有一个叫“默认”,Debug.Assert
将静默失败。
至于配置推移,这将工作假设一个名为默认监听器是可用的:
<system.diagnostics>
<trace autoflush="false">
<listeners>
</listeners>
</trace>
</system.diagnostics>
这将工作假设一个名为默认监听器是可用的:
<system.diagnostics>
<trace autoflush="false">
<listeners>
<add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
</listeners>
</trace>
</system.diagnostics>
这将作为我们明确地定义了我们的默认值:
<system.diagnostics>
<trace autoflush="false">
<listeners>
<remove name="Default" />
<add name="Default" type="System.Diagnostics.DefaultTraceListener" />
<add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
</listeners>
</trace>
</system.diagnostics>
这个WONT的工作:
<system.diagnostics>
<trace autoflush="false">
<listeners>
<remove name="Default" />
<add name="bigEarsListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="TracingInfo.log"/>
</listeners>
</trace>
</system.diagnostics>
如果你没有在你的web.config诊断部分则默认可能会得到一些VS扩展等删除或重写,所以加入这个部分应该把它带回预期的行为。
你有没有仔细检查过你没有运行发布版本? – ChrisF 2009-12-29 17:22:59
如何用Reflector打开你的dll/exe文件,看看assert是否真的在代码中?而且你的组件实际上是从你认为的位置加载的?也许再次检查您使用的是调试版本。 – 2009-12-29 17:27:24
@ChrisF:正如我所说的,是的。三次... :-) – 2009-12-29 17:27:25