C# 如何使用System.Diagnostics以编程方式设置源开关

C# 如何使用System.Diagnostics以编程方式设置源开关,c#,.net,trace,system.diagnostics,C#,.net,Trace,System.diagnostics,我遇到需要从System.Workflow.Activities.Rules捕获跟踪的情况。目前,我在代码中配置了一个自定义跟踪列表器: _traceListener = new InMemoryTraceListener(); System.Diagnostics.Trace.Listeners.Add(_traceListener); 在app.config中,我将源开关配置为: <?xml version="1.0" encoding="utf-8" ?> &

我遇到需要从System.Workflow.Activities.Rules捕获跟踪的情况。目前,我在代码中配置了一个自定义跟踪列表器:

    _traceListener = new InMemoryTraceListener();
    System.Diagnostics.Trace.Listeners.Add(_traceListener);
在app.config中,我将源开关配置为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.diagnostics>
    <switches>
      <add name="System.Workflow.Activities.Rules" value="Information"/>
    </switches>
  </system.diagnostics>
</configuration>

这是可行的,我能够在自定义跟踪侦听器中捕获竞争消息。我需要跟踪信息,因为它对整个解决方案至关重要,并且设置为所需的级别

但是,我需要通过编程而不是通过配置来配置交换机,因为它将进入GAC的dll

我用SourceSwitch和TraceSource尝试了许多不同的方法,但没有一种对我有效


编辑:总之,我想通过编程为.net framework中的现有源配置一个开关,以便可以侦听跟踪消息。

我猜您正在查找该类并执行类似操作

TraceSource mySource = new TraceSource("MySource");
mySource.Listeners.Add(new InMemoryTraceListener());

我已经改编了一些代码,我遇到了类似的事情。它通过非公共方法上的反射设置开关。这不是最佳实践,但还有其他更好的方法吗

 #region Dodgy dodgy hackery. There has to be a better way of doing this ....
 var trace = typeof(System.Workflow.Activities.StateActivity)
                .Assembly
                .GetType("System.Workflow.Activities.WorkflowActivityTrace");

 var rules = trace.GetProperty("Rules", BindingFlags.NonPublic | BindingFlags.Static)
                .GetValue(null, null)
                as System.Diagnostics.TraceSource;

 rules.Switch.Level = System.Diagnostics.SourceLevels.Information;

 rules.Listeners.Clear();
 rules.Listeners.Add(_traceListener);
 #endregion

这对我不起作用。我原以为在代码中编写跟踪消息时,您会使用TraceSource,而不是侦听来自.net framework源的跟踪消息?这是一种很棒的方法(hacky是的,但仍然如此),我正在尝试使用SignalR,但跟踪是其中的实例属性,因此,我可能需要找到实例化的TraceSources。所以这个解决方案很接近,但并不总是足够