PowerShell에서 추가 된 유형을 다시 제거 할 수 있습니까?
저는 현재 C #으로 라이브러리를 작성 중이며 어떤 경우에는 PowerShell을 사용하여 빠르게 테스트했습니다. 그러나 PowerShell에는 분명히 DLL이 열려 있기 때문에 프로젝트를 다시 빌드 할 수 없습니다.
DLL을 추가 한 후 다시 DLL을 언로드하는 방법이 Add-Type
있습니까? 문서에는 그것에 대한 단서가없는 것 같고 명백한 후보는 Remove-Type
(존재하지 않습니다. 어차피 Type
명사로 사용 되는 명령은 하나뿐입니다 ). PowerShell을 닫고 빌드 디렉터리로 이동하고 다시 빌드 할 때마다 유형을 다시 추가하는 모든 작업을 수행하는 것은 번거 롭습니다.
다른 사람들이 말했듯이 이것은 .NET 동작입니다. AppDomain에로드 된 어셈블리는 언로드 할 수 없습니다. AppDomain 만 언로드 할 수 있으며 powershell은 단일 appdomain을 사용합니다. 나는 몇 년 전에 이것에 대해 약간 블로그를 올렸다
이렇게 테스트 할 때 보통 쉘을 열어두고 중첩 된 쉘을 사용하여 테스트를 수행합니다. 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
'Program Tip' 카테고리의 다른 글
C #에서 F # List.map에 해당합니까? (0) | 2020.12.11 |
---|---|
Bash의 변경 가능한 목록 또는 배열 구조? (0) | 2020.12.11 |
축 제목에 그리스 문자 추가 (0) | 2020.12.11 |
Google + 1 버튼에 맞춤 이미지를 사용 하시겠습니까? (0) | 2020.12.11 |
HTML 웹 페이지에서 CSS 및 Javascript 코드를 어디에 넣어야합니까? (0) | 2020.12.11 |