2011-01-14 6 views
4

사용자 지정 형식을 제공하는 작은 PowerShell 모듈을 구현했습니다. .psm1 파일의 형식을 C# 클래스로 정의하고 Add-Type을 추가했습니다. 이제 모듈을 추가하고 다시 제거 할 때 유형이 여전히 있습니다. 이 적합하지 않습니다 (예 : 모듈을 다시 추가 할 수 없음). Remove-Module에 대한 설명서에는 모듈에 의해로드 된 어셈블리에 정의 된 유형도 언로드된다는 내용이 나와 있습니다. 하지만 제 모듈은 어셈블리를 가져 오지 않습니다. 소스 코드 형식의 작은 타입 일뿐입니다.PowerShell 2 모듈 유형

형식을 자체 DLL에 넣고 모듈 매니페스트에서로드 할 어셈블리로 표시 할 수는 있지만 현재 모든 소스 코드를 쉽게 볼 수있는 방식을 좋아합니다. 모듈과 함께 DLL을 배포하면 실행 파일이 필요한 이유가 의심 스러울 수 있습니다.

모듈을 내릴 때 어떻게 든 제거 할 수있는 것이 있습니까? 또는 적어도 일단 세션에서 제거한 모듈을 다시 추가 할 수 있다면 Add-Type으로 잠재적 인 오류를 무시해야합니까? 차라리 거기에 DLL을 두는 것을 피할 것입니다. (어쨌든 그 작은 모듈을 위해 과잉 공격을하는 것 같습니다).

답변

6

Remove-Module에있는 문서에서도 어셈블리가 언로드되지 않는다고 말합니다. 이것은 .NET 및 CLR의 근본적인 문제입니다. 어셈블리가 AppDomain에로드되면 언로드 할 수 없습니다. 따라서 자체 DLL (관리되는 어셈블리)을 만드는 것은 도움이되지 않습니다.

new-object psobject -prop @{...}$obj.psobject.typenames.insert(0, 'newtypename')을 사용하여 Add-Type을 피하고 사용자 정의 유형을 만드는 것이 부족하다는 것을 잘 모릅니다.

+0

흠, 적어도 새로운 것을 배웠습니다. 'PSObject'에는 그런 종류의 마술이 있다는 것을 몰랐습니다. 필자가 새로운 유형을 만든 주된 이유는'ps1xml' 파일을 통해 형식을 제어하고'PSObject'보다는 더 좋은 유형 이름을 가졌기 때문입니다. 그러나 분명히 이것은 잘 작동하지만 조금 더 hackish하다고 느낍니다 .--) 감사합니다. – Joey

관련 문제