Program Tip

PowerShell에서 추가 된 유형을 다시 제거 할 수 있습니까?

programtip 2020. 12. 11. 19:20
반응형

PowerShell에서 추가 된 유형을 다시 제거 할 수 있습니까?


저는 현재 C #으로 라이브러리를 작성 중이며 어떤 경우에는 PowerShell을 사용하여 빠르게 테스트했습니다. 그러나 PowerShell에는 분명히 DLL이 열려 있기 때문에 프로젝트를 다시 빌드 할 수 없습니다.

DLL을 추가 한 후 다시 DLL을 언로드하는 방법이 Add-Type있습니까? 문서에는 그것에 대한 단서가없는 것 같고 명백한 후보는 Remove-Type(존재하지 않습니다. 어차피 Type명사로 사용 되는 명령은 하나뿐입니다 ). PowerShell을 닫고 빌드 디렉터리로 이동하고 다시 빌드 할 때마다 유형을 다시 추가하는 모든 작업을 수행하는 것은 번거 롭습니다.


다른 사람들이 말했듯이 이것은 .NET 동작입니다. AppDomain에로드 된 어셈블리는 언로드 할 수 없습니다. AppDomain 만 언로드 할 수 있으며 powershell은 단일 appdomain을 사용합니다. 나는 몇 년 전에 이것에 대해 약간 블로그를 올렸다

https://web.archive.org/web/20170707034334/http://www.nivot.org/blog/post/2007/12/07/WhyAppDomainsAreNotAMagicBullet

이렇게 테스트 할 때 보통 쉘을 열어두고 중첩 된 쉘을 사용하여 테스트를 수행합니다. powershell을 시작하고 bin 위치로 cd 한 다음 "powershell"을 실행하여 중첩 된 셸 (새 프로세스)을 시작합니다. "exit"를 사용하여 다시 시작하고 "powershell"을 다시 실행합니다.


이 문제를 해결하는 가장 간단한 방법은 Add-Type및 테스트 코드를 Start-Job. 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

테스트 방법의 출력은 콘솔에 표시됩니다.


어셈블리에 바인딩 컨텍스트가 필요하지 않은 경우 다음을 수행 할 수 있습니다.

$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 그렇지 않으면 손실 될 것이기 때문에 작업의 출력이 수신되었는지 확인합니다.


나는 비슷한 문제에 직면하고 있습니다. 유형 / 어셈블리를 언로드 할 수 없습니다 (.NET 프레임 워크에 적용되기 때문).

.NET에서는 새 응용 프로그램 도메인 ( System.AppDomain)을 만들고 해당 도메인에 어셈블리를로드하면 문제를 해결할 수 있습니다 . 앱 도메인을 언로드 할 수 있으며 모든 dll도 언로드합니다.

콘솔 에서 탭을 닫고 탭을 여는 것이 훨씬 더 간단하기 때문에 아직 시도하지 않았습니다 .

참고 URL : https://stackoverflow.com/questions/3369662/can-you-remove-an-add-ed-type-in-powershell-again

반응형