如何使用Add-Type函数以DEBUG模式编译C#代码并实现调试
如何用Add-Type以Debug模式编译C#代码并调试
别担心,这个问题很好解决!Add-Type本身支持通过-CompilerParameters参数传递编译选项,我们只需要启用调试信息生成,再配合调试器就能实现断点调试了。下面是具体步骤和代码示例:
1. 修改Add-Type调用,启用Debug编译
首先,我们需要创建System.CodeDom.Compiler.CompilerParameters对象,开启调试信息生成,并指定必要的参数。替换你原来的代码为以下内容:
# 定义需要引用的程序集 $ReferencedAssemblies = @( 'System.Data.DataSetExtensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 'Microsoft.CSharp, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 'System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 'System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' ) # 创建编译参数对象,启用调试信息 $compilerParams = New-Object System.CodeDom.Compiler.CompilerParameters $compilerParams.ReferencedAssemblies.AddRange($ReferencedAssemblies) $compilerParams.GenerateDebugInfo = $true # 可选:指定输出的程序集和PDB文件路径(默认会在临时目录,指定后更易管理) $outputPath = Join-Path $PSScriptRoot "CompiledCode" $compilerParams.OutputAssembly = Join-Path $outputPath "MyProgram.dll" # 保留临时文件(避免编译后自动删除PDB) $compilerParams.TempFiles = New-Object System.CodeDom.Compiler.TempFileCollection($outputPath, $true) # 读取你的C#代码文件 $TypeDefinition = Get-Content -Path "$PSScriptRoot\Program.cs" -Raw # 以Debug模式编译并加载类型 Add-Type -TypeDefinition $TypeDefinition -CompilerParameters $compilerParams
2. 在C#代码中添加调试触发点
为了让调试器能捕获到代码执行,你可以在Program.cs里需要调试的位置添加一行触发代码:
// 在需要调试的方法或代码块开头添加 System.Diagnostics.Debugger.Break();
当PowerShell执行到这一行时,会自动弹出调试器选择窗口,你可以选择Visual Studio(或其他支持.NET调试的工具)来开始调试。
3. 手动附加调试器(可选)
如果你不想用Debugger.Break(),也可以提前打开Visual Studio,按以下步骤操作:
- 点击顶部菜单的调试 -> 附加到进程
- 在进程列表中找到
powershell.exe(Windows PowerShell)或pwsh.exe(PowerShell 7+) - 选中进程后点击附加,之后执行你的PowerShell脚本,调试器会命中你在C#代码中设置的断点
注意事项
- 确保生成的
.pdb文件和.dll文件在同一目录,否则调试器无法找到符号信息 - 如果使用PowerShell Core,注意进程名是
pwsh.exe,不要选错 - 调试完成后,记得清理生成的
dll和pdb文件(如果指定了输出路径的话)
内容的提问来源于stack exchange,提问作者fdafadf
相关产品推荐
相关产品推荐

