【问题标题】:Turn WPF Binding error into runtime exception. Not working on published Released app将 WPF 绑定错误转换为运行时异常。不适用于已发布的已发布应用程序
【发布时间】:2013-10-16 23:07:17
【问题描述】:

我想将 DataBinding 错误记录到文件中。 我使用了这个接受的答案中提出的解决方案:

How can I turn binding errors into runtime exceptions?

我也试过这个:http://msdn.microsoft.com/en-us/library/system.diagnostics.presentationtracesources.aspx

问题是它只在 VS IDE 中运行时才有效。当我发布应用程序时,没有发现错误。

有人知道如何在运行时通过已发布的应用程序以编程方式获取 WPF Bindind 错误并将其保存到文件吗?

【问题讨论】:

  • 你为什么想要这样的东西?我的意思是在开发时捕获绑定错误是一件好事,但是一旦部署了您的应用程序……您是否害怕您的客户会对您的应用程序进行逆向工程并植入绑定错误?
  • 我同意发布的应用程序不应该存在错误,我知道,但是应用程序不小,我不知道错误在哪里,所以我认为发布的应用程序有一些错误应用到文件会有所帮助。
  • 我同意其他 cmets。通常情况相反,事情在开发环境中运行良好,然后由于某种原因部署失败。恕我直言,这是一个不错的功能。
  • @Tony 不要误会我的意思。为了检测运行时错误,错误处理和客户端日志记录对于已发布的应用程序非常重要,但 BINDING 错误不会突然出现。要么你的数据绑定设置正确,要么没有。
  • 我同意。问题是这里的绑定没有问题,所以我怀疑一些运行时竞争条件可能导致一些无效的绑定。是不是一个稳定的错误。这有点随机。这就是我尝试保存那些绑定错误的原因。

标签: c# wpf


【解决方案1】:

我使用的技术类似于您提供的第一个链接中描述的技术。可以通过以下步骤恢复:

  1. 派生一个 TraceListener,它会抛出而不是记录日志
  2. 将您的听众添加到PresentationTraceSources.DataBindingSource

我使用 .NET Framework 4.0、4.5 和 4.5.1 进行了测试;它适用于 DebugRelease 配置。

请查看complete solution I pushed on GitHub,它包括一个演示应用程序和一个单元测试项目。

【讨论】:

【解决方案2】:

我参加聚会有点晚了,但我最近遇到了同样的问题,并深入研究了 .NET 源代码。

所以问题是只有在满足以下条件之一时才启用跟踪

AvTrace.cs:

private static bool ShouldCreateTraceSources()
{
    return AvTrace.IsWpfTracingEnabledInRegistry() || AvTrace.IsDebuggerAttached() || AvTrace._hasBeenRefreshed;
}

所以只有在以下情况下才会报告绑定错误:

  • 在注册表中启用了 WPF 跟踪 (HKCU\Software\Microsoft\Tracing\WPF\ManagedTracing)

  • 已附加调试器(无论应用程序是在调试模式还是发布模式下编译)

  • 跟踪源已刷新

最后一个比较棘手 - 当您手动更新跟踪源时会刷新跟踪源:

PresentationTraceSources.DataBindingSource

这就是它在 Benoit Blanchon 提供的解决方案中起作用的原因

但是当您直接在 app.config 文件中定义跟踪源时,它将不起作用。 如果要创建溯源,需要手动调用:

PresentationTraceSources.Refresh();

这将重新读取 app.config,但也会调用内部 AvTrace.OnRefresh(),这将更改 _hasBeenRefreshed 标志并启用跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2019-11-21
    • 2013-06-04
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多