.NET 7动态加载代码如何输出内容到调试窗口?
动态加载DLL的日志输出解决方案
1. 修复Trace/Debug无输出问题
动态编译的代码默认没有配置TraceListener,导致Debug.WriteLine或Trace.WriteLine的输出没有接收端。在主程序启动时添加监听即可解决:
// 添加控制台监听,输出到主程序控制台 System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.ConsoleTraceListener()); // 可选:添加文件监听,输出到指定日志文件 System.Diagnostics.Trace.Listeners.Add(new System.Diagnostics.TextWriterTraceListener("dynamic_code.log")); // 开启自动刷新,确保日志实时写入 System.Diagnostics.Trace.AutoFlush = true;
注意:Debug类的输出仅在Debug编译模式下生效,Release模式会被编译器移除,建议优先使用Trace类保证全模式可用。
2. 直接使用Console输出
最轻量化的方案,动态代码里直接调用Console.WriteLine("动态代码执行日志"),主程序的控制台会直接显示内容。如果是WinForm/WPF等无控制台的程序,可以在主程序中手动调出控制台:
[System.Runtime.InteropServices.DllImport("kernel32.dll")] private static extern bool AllocConsole(); // 主程序初始化时调用 AllocConsole();
之后动态代码的Console输出会显示在弹出的控制台窗口中。
3. 自定义日志委托(灵活集成主程序日志系统)
通过给动态代码传递日志委托,让动态代码复用主程序的日志能力(比如对接NLog、Serilog等框架),可控性最强:
主程序侧定义委托与日志方法
// 定义日志委托 public delegate void LogDelegate(string message); // 主程序的日志处理方法 public static void MainAppLogger(string logMsg) { // 这里可以对接主程序的日志系统,比如写入数据库、输出到UI日志面板 Console.WriteLine($"[主程序日志] {logMsg}"); }
动态代码侧接收并调用委托
动态编译的代码中,将委托作为类的属性或方法参数:
public class DynamicWorker { // 接收主程序传递的日志委托 public LogDelegate Logger { get; set; } public void ExecuteTask() { Logger?.Invoke("动态任务开始执行"); // 业务逻辑代码 Logger?.Invoke("动态任务执行完成"); } }
主程序加载后绑定委托
// 加载动态程序集并创建实例 var dynamicType = loadedAssembly.GetType("DynamicWorker"); var dynamicInstance = Activator.CreateInstance(dynamicType); // 绑定日志委托 dynamicInstance.GetType().GetProperty("Logger").SetValue(dynamicInstance, (LogDelegate)MainAppLogger); // 调用动态方法 dynamicInstance.GetType().GetMethod("ExecuteTask").Invoke(dynamicInstance, null);
4. VS调试时在输出窗口查看日志
如果需要在VS的“输出”窗口查看动态代码的调试日志,需满足两个条件:
- 动态编译时生成调试信息:编译参数中启用调试符号
var compileParams = new System.CodeDom.Compiler.CompilerParameters { GenerateInMemory = true, IncludeDebugInformation = true, // 生成调试信息 DebugSymbols = true }; - 主程序调试配置中启用调试器助手:右键主项目→属性→调试→勾选“启用调试器助手”
配置完成后,调试时动态代码的Trace.WriteLine输出会显示在VS的“输出”窗口(确保窗口选择“调试”类别)。
内容的提问来源于stack exchange,提问作者Boppity Bop
相关产品推荐
相关产品推荐

