PowerShell에서 추가 유형을 다시 제거할 수 있습니까?
저는 현재 C#로 라이브러리를 작성하고 있으며 PowerShell을 사용하여 어떤 경우에는 빠르게 테스트를 참조하십시오.그러나 PowerShell의 DLL이 여전히 열려 있기 때문에 프로젝트를 다시 빌드할 수 없습니다.
DLL을 추가한 후 다시 언로드할 수 있는 방법이 있습니까?Add-Type
그 문서는 그것에 대한 단서를 가지고 있지 않은 것처럼 보이고 명백한 후보자일 것입니다.Remove-Type
(존재하지 않음 – 어쨌든 명령은 하나뿐임Type
명사로서)PowerShell을 닫고 빌드 디렉토리로 이동하여 재구축할 때마다 유형을 다시 추가하는 모든 작업을 수행하는 것이 번거롭습니다.
다른 사람들이 말했듯이, 이것은 .NET 동작입니다.AppDomain에 로드된 어셈블리를 언로드할 수 없습니다.AppDomain만 언로드할 수 있으며 powershell은 단일 appDomain을 사용합니다.저는 몇 년 전에 이것에 대해 블로그에 조금 올렸습니다.
제가 이런 테스트를 할 때 저는 보통 셸을 열어두고 네스트된 셸을 사용하여 테스트를 합니다. 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
'programing' 카테고리의 다른 글
가져오기 오류: 'jinja2'에서 'escape' 이름을 가져올 수 없습니다. (0) | 2023.05.21 |
---|---|
MongoDB 집계 비교: group(), $group 및 MapReduce (0) | 2023.05.21 |
공용 VBA 메서드가 Excel 매크로 목록에 표시되지 않도록 하기 (0) | 2023.05.21 |
Postgres 9.3에서 현재 표준 시간대 이름을 가져오려면 어떻게 해야 합니까? (0) | 2023.05.21 |
ASP.NET web.config: configSource vs. 파일 속성 (0) | 2023.05.21 |