我正在调试 Powershell 项目。我正在使用 Import-Module
从我的 C# dll 加载 PS 模块,一切正常。尽管调用 Remove-Module
并不会完全卸载模块,因为 DLL 仍处于锁定状态且无法删除。
有没有办法让 PSH 完全卸载模块并释放 DLL,以便我可以复制它并使用 Import-Module
重新加载它,而无需重新启动 PSH 控制台?
更新
因此,如果将模块加载到单独的 AppDomain 中,它仍然像普通模块一样工作吗?谁能举个例子吗?
最佳答案
有一个解决方法。打开 PowerShell 的另一个实例:
PS > powershell
PS > [load DLL]
PS > [do work]
PS > exit
退出后,您将返回到进行此调用的 PowerShell 实例(假设您在 PowerShell 实例内部进行了 powershell
调用)。您可以将任何常规参数传递给 powershell
,因此您可以使用 -Command 或 -File。例如,
PS > powershell -Command '[load DLL]; [do work]' # Executes a command and exits
PS > powershell -Command '.\myscript.ps1 param1 param2' # Executes the script and exits
PS > powershell -File .\myscript.ps1 param1 param2 # Executes a script and exits.
当 PowerShell 退出时,它将释放 DLL 上的锁定,允许您继续工作。
所有这些都是通过 PowerShell 命令行界面完成的。我尚未测试如果您在脚本中间添加 powershell
或这在 ISE 中是否有效,会发生什么情况。 (我怀疑它可以在 ISE 中工作。)即使在脚本中不起作用,这在开发过程中仍然有用。
编辑:
做了一些检查。因此,这似乎在脚本和 ISE 中工作得很好,但 ISE 中有一个警告。在 ISE 中,当您处于单独的 PowerShell 进程中时,您无法读取用户的任何输入。如果您尝试,脚本或命令会停止等待,但不会像平常一样显示输入框,当然,您无法直接在 ISE 的输出窗口中键入内容。因此,如果您需要在[do work]
中间提示输入,请在before启动PowerShell的新实例之前提示,并将其作为参数传递到work中。如果您使用常规 PowerShell 命令行,这些根本不是问题。
关于.net - Powershell 卸载模块...完全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337961/