【问题标题】:Trace.WriteLine not working in dynamically loaded assembly compiled with CSharpCodeProviderTrace.WriteLine 在使用 CSharpCodeProvider 编译的动态加载程序集中不起作用
【发布时间】:2013-01-03 00:57:20
【问题描述】:

有没有人知道为什么在动态加载(使用 Assembly.CreateInstance)程序集中调用 Trace 调用时不会产生输出?奇怪的是,Debug.WriteLine 在程序集内工作得很好,并且来自正在执行动态加载的程序集内的 Trace 调用也工作得很好。我已经确认 Trace.Listeners 包含正确的侦听器对象(与 Debug.Listeners 相同),但对 Trace 的调用不会产生任何输出。

这对我来说是一个巨大的诊断问题,因为我的整个应用程序都通过自定义 TraceListener 进行记录。

更新:(来自下面的 cmets)我正在使用 CSharpCodeProvider 动态构建程序集,但我没有在 CompilerParameters.CompilerOptions 中提供 /d:TRACE 开关。因此 TRACE 没有在程序集中定义,我对 Trace 的调用基本上被忽略了。还值得注意的是,我正在设置CompilerParameters.IncludeDebugInformation = true,这可以解释为什么即使我没有在CompilerParameters.CompilerOptions 中明确设置/d:DEBUG,我也会得到调试。这只是一个猜测 - MSDN 文档中没有任何内容表明这是真的。

这里的底线是,当使用CSharpCodeProvider 动态编译源代码时,任何特定于程序集的内容都由您明确定义。

【问题讨论】:

    标签: c# .net dll .net-assembly


    【解决方案1】:

    DEBUG 和 TRACE 是 2 个不同的不相关的定义控制相应的方法。使用 TRACE 编译的程序集可能没有定义,因此 Trace 方法没有做任何事情。

    【讨论】:

    • 谢谢阿列克谢。这确实是问题所在。只是为了澄清后代......我正在使用CSharpCodeProvider动态构建程序集,但我没有在CompilerParameters.CompilerOptions中提供/d:TRACE开关。因此 TRACE 没有在程序集中定义,我对 Trace 的调用基本上被忽略了。
    • 另外,为了清楚起见,DEBUG 和 TRACE 使用相同的管道并且实际上使用相同的侦听器集(Debug.ListenersTrace.Listeners 指向相同的 TraceListenerCollection)。两者之间的唯一区别是一个查找 DEBUG def 而另一个查找 TRACE def。这允许您为调试和发布版本指定不同的输出,例如,通过在调试版本中定义 TRACE 和 DEBUG,但在发布版本中只定义 TRACE。请注意,VS 调试版本默认定义了这两个开关。
    • @JakeFoster,非常好的 cmets。考虑调整您的问题以匹配调查结果,因为可能许多使用 CSharpCodeProvider 编译代码的人忘记了这些定义(即将标题更改为“...用 CSharpCodeProvider 编译”并添加关于如何创建程序集的一两句话)。或者我可以稍后进行更改,您可以将它们回滚。
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2012-10-27
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多