代码之家  ›  专栏  ›  技术社区  ›  Joey

是否可以再次删除PowerShell中的添加ed类型?

  •  58
  • Joey  · 技术社区  · 14 年前

    我目前正在用C语言编写一个库,并在某些情况下使用PowerShell快速测试它。但是,这阻止了我重新构建项目,因为PowerShell显然仍然打开了DLL。

    添加dll后是否可以再次卸载它? Add-Type ?文件似乎没有线索,显然候选人 Remove-Type (不存在)总之只有一个命令 Type 作为名词)。关闭PowerShell并执行所有导航到build目录的操作,并在每次需要重新生成时再次添加类型,这很麻烦。

    5 回复  |  直到 7 年前
        1
  •  53
  •   x0n    14 年前

    就像其他人说的,这是.NET行为。无法卸载加载到AppDomain中的程序集。只能卸载AppDomain,PowerShell使用单个AppDomain。几年前我写了一篇关于这个的博客: http://www.nivot.org/2007/12/07/WhyAppDomainsAreNotAMagicBullet.aspx

    当我这样测试时,我通常保持一个shell打开,并使用嵌套的shell进行测试。启动PowerShell,CD到bin位置,然后运行“PowerShell”以启动嵌套shell(新进程)。“exit”以重新启动,然后再次运行“PowerShell”。

        2
  •  35
  •   Katie Kilian Fenton    7 年前

    我发现解决这个问题的最简单方法是 Add-Type 测试代码在 Start-Job . 开始作业 将创建一个后台进程,类型将在该进程中加载。一旦你完成了,这个过程就消失了,你可以重新尝试。

    下面是它的外观示例:

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

    测试方法的输出将被回送到控制台。

        3
  •  22
  •   George Howarth    14 年前

    如果您的程序集不需要 binding context 您可以这样做:

    $bytes = [System.IO.File]::ReadAllBytes("Path_To_Your_Dll.dll")
    [System.Reflection.Assembly]::Load($bytes)
    
        4
  •  3
  •   KnaÄ£is    7 年前

    下面是一个完整的示例,允许运行 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 将确保接收作业的输出,否则将丢失。

        5
  •  0
  •   stej    14 年前

    我也遇到过类似的问题。无法卸载类型/程序集(这是因为它适用于.NET框架)。

    在.NET中,如果您装入一个新的应用程序域,就可以解决这个问题。( System.AppDomain )并将程序集加载到该域中。可以卸载应用程序域,也可以卸载所有DLL。

    我还没试过,因为对我来说,关闭一个标签要简单得多 Console 打开新的。