【问题标题】:Running and debugging Powershell modules in Visual Studio 2017在 Visual Studio 2017 中运行和调试 Powershell 模块
【发布时间】:2018-10-28 01:39:00
【问题描述】:

我正在 Visual Studio 2017 中使用 C# 开发 Powershell 模块。 开发体验在运行和调试方面如此糟糕,我有点惊讶,所以我在这里碰碰运气。

它现在对我的工作方式如下:

  1. 实现模块
  2. 编译
  3. 启动一个新的 Powershell 窗口
  4. 导航到 bin/debug 文件夹
  5. 导入编译好的DLL (import-module)
  6. 运行命令
  7. 关闭 Powershell 窗口(否则我无法重建项目,因为 DLL 文件被锁定)
  8. 修复错误,然后返回步骤 #2

如果我需要调试代码,我使用 VS2017 attach 来处理和调试代码(在步骤 #5 之后)。

这在 DX 方面并不理想,我希望有更好的东西,尽可能接近:

  1. 实现模块
  2. 编译
  3. 按 F5 (start)
  4. Powershell 窗口打开并加载了模块
  5. 运行命令
  6. 断点命中暂停程序,就像我们以前一样

我如何做到这一点?

【问题讨论】:

  • powershell如何锁定dll?它应该只阅读它。
  • Google 很好地解释了这一点,但简而言之——PS 中任何导入的模块都会加载到 PS 窗口的同一个 AppDomain 中。因此,只要 PS 窗口保持打开状态,.DLL 就被该 AppDomain 使用并因此被锁定。 (直到PS窗口关闭)
  • 如果您将 powershell.exe 指定为要启动的可执行文件,并使用加载模块所需的应用程序参数(例如 -noexit -command "&{ ipmo }")就可以了仍然锁定程序集?

标签: c# visual-studio powershell module visual-studio-2017


【解决方案1】:

在@Glenn 的上述评论的帮助下,我设法完成了这项工作:

  • 使用外部程序开始调试

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    
  • 和参数行

    -NoExit -command "Import-Module '<path to your module>'; " 
    

现在您可以按 F5 开始 -> 使用已加载的模块获取 powershell 窗口,并且调试器已附加到此进程。

但是,如果您的二进制模块是针对 .NET Standard 编写的,则必须小心。在这种情况下,调试器(VS2017 15.8.9)似乎无法检测到要加载哪些运行时模块。所以在这种情况下根本没有断点!我在这里的快速解决方法是使用面向 .NET 框架 4.xy 的控制台应用程序添加另一个项目,并将这个其他项目用作具有上述设置的启动项目。现在我的工作流程完全反映了您的第二个序列(1-6)。卸载 dll 没有问题,因为停止调试确实会结束进程。

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多