你能否再次删除PowerShell中的添加types?

我目前正在用C#编写一个库,并在某些场合使用PowerShell来快速testing它。 但是,这阻止了我重新构build项目,因为PowerShell显然仍然会打开DLL。

Add-Type后,有没有办法再次卸载DLL? 文档似乎没有线索,明显的候选人将是Remove-Type (这不存在 – 只有一个命令无论如何与Type作为它的名词)。 closuresPowerShell并执行导航到构build目录的所有内容,并在每次重新构build时重新添加types都变得非常麻烦。

像其他人所说,这是一个.NET行为。 加载到AppDomain中的程序集不能被卸载。 只有AppDomain可以被卸载,而powershell使用一个appdomain。 几年前我就这样写了一些内容: http : //www.nivot.org/2007/12/07/WhyAppDomainsAreNotAMagicBullet.aspx

当我这样testing的时候,我通常会打开一个shell并使用一个嵌套的shell来做testing。 启动powershell,cd到bin位置,然后运行“powershell”启动嵌套的shell(新进程。)“exit”重新开始,再次运行“powershell”。

我发现解决这个问题最简单的方法是将Add-Type和testing代码包装在Start-JobStart-Job将创build一个后台进程,并将在那里加载types。 一旦你完成,这个过程消失,你可以自由地重试。

以下是它的外观示例:

 $job = Start-Job -ScriptBlock { Add-Type -path 'my.dll' $myObj = new-object My.MyTestClassName $result = $myObj.TestMethod $result } Wait-Job $job Receive-Job $job 

testing方法的输出将被回显到控制台。

如果你的程序集不需要绑定上下文,你可以这样做:

 $bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll") [System.Reflection.Assembly]::Load($bytes) 

下面是一个完整的例子,它允许运行Add-Type命令作为后台作业,以便在程序集完成时卸载程序集:

 # Start-Job will not preserve the working directory, so do it manually # Other arguments can also be passed to the job this way $cd = Split-Path $MyInvocation.MyCommand.Path $jobParams = @{ 'cd' = $cd } Start-Job -InputObject $jobParams -ScriptBlock { cd $Input.cd Add-Type -Path assembly.dll } | Receive-Job -Wait -AutoRemoveJob 

Receive-Job -Wait将确保收到作业的输出,否则将会丢失。

我一直面临类似的问题。 不能卸载types/程序集(这是因为它适用于.NET框架)。

在.NET中,如果创build新的应用程序域( System.AppDomain )并将程序集加载到该域中,则可以解决此问题。 卸载应用程序域并卸载所有的dll也是可能的。

我还没有尝试过,因为对于我来说,在控制台中closures一个标签并打开一个新标签要简单得多。