programing

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

goodsources 2023. 5. 21. 11:22
반응형

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

저는 현재 C#로 라이브러리를 작성하고 있으며 PowerShell을 사용하여 어떤 경우에는 빠르게 테스트를 참조하십시오.그러나 PowerShell의 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을 시작하고 cd to bin 위치를 지정한 다음 "powershell"을 실행하여 네스트된 셸(새 프로세스)을 시작합니다."powershell"을 다시 시작하고 "powershell"을 다시 실행합니다.

저는 이 문제를 해결하는 가장 간단한 방법은 포장하는 것이라고 생각합니다.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

테스트 방법의 출력이 콘솔에 반향됩니다.

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

$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도 언로드합니다.

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

Visual Studio 코드:

설정 -> 확장 -> PowerShell 구성 -> 디버깅 : 임시 통합 콘솔 생성

확인란: "PowerShell 클래스이진 모듈 디버깅에 유용한 각 디버깅 세션에 대해 임시 PowerShell 통합 콘솔을 생성할지 여부를 결정합니다."

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

반응형