我的公司有一个用C#编写的.NET Powershell模块,以允许高级用户自动执行我们产品中的任务。当前,它使用.NET 4.6.1针对Powershell 5。我们希望允许使用其他操作系统的客户也使用它,并且由于它没有特定于操作系统的代码,因此移植起来非常简单。
但是,我找不到应遵循的调试工作流程的文档。在标准.NET Powershell中,这非常简单,并且需要一次性设置过程:
但是,这不适用于Powershell Core。由于项目依赖于NuGet软件包,因此模块注册失败,并显示依赖项错误。我能够弄清楚另一个工作流程,但是它有点钝:
dotnet publish -f netstandard2.0 -c debug
Import-Module ./bin/Debug/netstandard2.0/publish/MyModule.dll
$pid
来找到PID 这可行,并且我已经调试了这种方法的一些问题,但这并不是最令人愉快或有效的方法。我相信,必须有一种更好的方法,而只是没有得到很好的记录。
答案 0 :(得分:1)
我无法比我在问题中描述的步骤做得好得多,但是我想出了一个边界线可接受的脚本来运行它们,尽管附加调试器确实涉及第二个手动步骤。我肯定一定会缺少一些东西,但也许调试经验仍在开发中。
param (
$Module = "MyModule",
$Framework = "netstandard2.0",
$Configuration = "Debug",
[switch] $ExitWhenComplete
)
try {
Push-Location $Module
& dotnet publish -f $Framework -c $Configuration
} finally {
Pop-Location
}
if ($LASTEXITCODE -ne 0) {
Write-Warning "Build failed";
exit 1;
}
$modulePath = [System.IO.Path]::Combine($PSScriptRoot, $Module, "bin", $Configuration, $Framework, "publish", "$Module.dll");
$command = "Import-Module `"$modulePath`"; ";
$command += "Write-Host `"You are now debugging $Module.dll - attach to PID `$pid`"; ";
$command += "Write-Host `"Type 'exit' to quit.`"; ";
$command += "Write-Host; ";
$testScript = "Launch.user.ps1";
if (Test-Path $testScript) {
$command += "Read-Host `"About to execute $testScript - hit enter to continue.`"; ";
$command += "& ./$testScript; ";
}
$command += "function prompt { write-host `"[debug] `" -ForegroundColor Yellow; } ";
if ($ExitWhenComplete) {
$command += "exit; ";
}
& pwsh -NoExit -NoProfile -Command $command;
Write-Host "Pwsh finished executing.";
默认情况下,您可以更新$Module
以运行此模块,并在调试会话开始时在同一目录中创建Launch.user.ps1文件以运行命令。在运行脚本之前但在加载模块之后,系统会提示您附加调试器。
正如我说的那样,这并不理想,但这也许可以帮助某人。