Powershell System.IO.Compression.FileSystem.dll 오류

얼마 전, 제가 PowerShell 스크립트를 실행하려고 했는데 예상치 못한 오류 메시지가 튀어나왔어요.
“Add-Type : 파일이나 어셈블리 … 로드할 수 없습니다”라는 말과 함께, ‘현재 로드된 런타임보다 최신 런타임으로 어셈블리를 빌드했기 때문에 로드할 수 없다’고 하더라고요.
이거 처음 보면 꽤 당황스러울 수 있어요. 뭐가 문제인지도 감이 잘 안 오고… 그래서 저처럼 이 오류에 부딪힌 분들을 위해, 해결 방법을 하나씩 정리해봤어요.

【1. 오류 메시지의 의미 파악하기】

Add-Type : 파일이나 어셈블리 'file:///C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.IO.Compression.FileSystem.dll' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다. 현재 로드된 런타임보다 최신 런타임으로 어셈블리를 빌드했으므로 어셈블리를 로드할 수 없습니다.

우선 이 오류 메시지를 잘 살펴보면 핵심은 “현재 로드된 런타임보다 최신 런타임으로 어셈블리를 빌드했기 때문에 로드할 수 없다”는 거예요.
즉, PowerShell이 내부적으로 사용하는 .NET Framework 버전보다, 내가 추가하려는 DLL(예: System.IO.Compression.FileSystem.dll)이 더 최신 버전에서 만들어졌다는 거죠.
그래서 단순히 파일 경로가 맞다고 해서 무조건 로드되는 게 아니고, 런타임 버전도 맞아야 된다는 거예요.

이런 문제는 보통 PowerShell이 기본적으로 .NET Framework 2.0~4.0 정도의 오래된 버전을 사용하는 경우에 자주 발생해요. 특히, Windows 10 이전 환경이나 PowerShell 5.1 이하에서 자주 보이죠.


【2. PowerShell 버전 확인 및 업그레이드】

제일 먼저 해볼 건, 내 PowerShell 버전 확인이에요. 콘솔에 다음 명령을 입력해 보세요:

$PSVersionTable.PSVersion

버전이 5.1 이하라면, 최신 .NET 및 .NET Core 기반의 PowerShell로 업그레이드하는 게 좋아요.
요즘은 PowerShell 7 버전이 기본이 되어가고 있고, 이 버전은 .NET 6~8과 같은 최신 런타임을 지원하거든요.

PowerShell 7 설치는 어렵지 않아요. 아래 링크에서 운영체제에 맞는 설치 파일만 내려받으면 돼요:
https://github.com/PowerShell/PowerShell/releases

설치 후에는 pwsh 명령어로 새 PowerShell 7을 실행해보세요. 기존 PowerShell과는 별도로 실행됩니다.


【3. 대안: 코드에서 압축 로직 직접 구현하기】

꼭 PowerShell 5.1을 써야 하는 상황이라면, Add-Type으로 외부 DLL을 로드하는 대신에 .NET 내부의 기본 클래스만으로도 압축 관련 기능을 구현할 수 있어요. 예를 들면 System.IO.Compression.ZipArchive 클래스 같은 거요.

예시로 간단한 압축 풀기 코드는 이런 식으로 바꿔볼 수 있어요:

Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory("C:\test.zip", "C:\unzipped")

이때도 여전히 DLL 충돌이 나는 경우라면, System.IO.Compression.FileSystem.dll을 불러오는 대신 Windows 자체 제공 명령어인 Expand-Archive를 활용해보는 것도 방법이에요:

Expand-Archive -Path "C:\test.zip" -DestinationPath "C:\unzipped"

이 명령어는 Windows PowerShell 5.1 이상이면 기본 제공되니까, 별도 DLL 필요 없이 간단하죠!


【4. .NET Framework 버전 확인 및 관리 방법】

PowerShell 내부 문제만이 아니라, 내 PC에 설치된 .NET Framework 자체가 너무 오래됐을 수도 있어요.
이런 경우에는 해당 DLL을 지원할 수 있는 런타임 자체가 없기 때문에, PowerShell에서 아무리 애써도 오류가 계속 날 수밖에 없죠.

현재 설치된 .NET Framework 버전은 레지스트리에서 확인할 수 있어요. 다음 명령어를 입력해 보세요:

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full' | Get-ItemPropertyValue -Name Release

이 숫자를 확인한 다음, 공식 Microsoft 문서를 참고해서 설치된 버전이 어떤 건지 확인할 수 있어요.

예를 들어 Release 값이 528040이라면 .NET Framework 4.8이 설치된 상태라는 뜻이에요.
만약 이보다 낮은 숫자라면, Microsoft 공식 사이트에서 .NET Framework 4.8 이상 버전을 설치해주는 게 좋아요.
다운로드 링크: https://dotnet.microsoft.com/en-us/download/dotnet-framework

설치 후에는 시스템을 재시작해야 적용이 되니까, 꼭 리부팅까지 잊지 마세요!


【5. 임시 해결책: 해당 DLL 직접 재빌드 또는 버전 맞추기】

정 안 되면… 해당 System.IO.Compression.FileSystem.dll을 현재 시스템과 호환되는 버전으로 직접 빌드하거나, 하위 버전 DLL을 구해서 대체하는 방법도 있어요.
물론 이건 개발 환경이 있거나 관련 지식이 있는 경우에만 추천해요.

Visual Studio나 Rider 같은 IDE에서 타겟 프레임워크를 .NET Framework 4.5 이하로 설정해서 빌드하면, PowerShell 5.1에서도 불러올 수 있는 DLL을 만들 수 있어요.
하지만 일반 사용자 입장에서는 이 방법보다는 아예 PowerShell 7로 갈아타는 게 훨씬 편하긴 해요.

【Q&A】

Q1. PowerShell에서 특정 DLL이 로드되지 않는 이유는 뭔가요?
A1. 대부분은 해당 DLL이 현재 PowerShell이 사용하는 .NET 런타임보다 최신 버전으로 빌드되어 있기 때문이에요. PowerShell 5.1은 .NET Framework 4.0~4.5 정도만 안정적으로 지원하기 때문에, 그보다 높은 버전에서 만든 DLL은 로딩에 실패할 수 있어요.

Q2. PowerShell 7로 바꾸면 이런 문제는 안 생기나요?
A2. 거의 대부분 해결돼요. PowerShell 7은 .NET 6 이상 기반으로 작동하고, 더 최신 DLL을 안정적으로 로드할 수 있어요. 특히 모듈 호환성과 런타임 충돌 문제가 줄어들어서 개발이나 스크립트 작성이 훨씬 유연해져요.

Q3. System.IO.Compression.FileSystem.dll을 반드시 써야 하나요?
A3. 아니에요. 같은 기능을 Expand-ArchiveCompress-Archive 같은 PowerShell 기본 명령어로도 구현할 수 있어요. 기능상 큰 차이는 없고, PowerShell 환경에 맞게 맞춰 쓰면 돼요.

Q4. 레지스트리에서 .NET 버전이 안 뜨는 경우는요?
A4. 아예 .NET Framework 4.5 이상이 설치돼 있지 않은 거일 수도 있어요. 그런 경우는 Microsoft 공식 사이트에서 최신 버전을 설치해 주는 게 좋아요. 설치 후에는 재부팅도 꼭 필요해요.

Q5. DLL을 하위 호환 버전으로 바꿔 쓰려면 어떻게 하나요?
A5. Visual Studio 등 개발툴이 있으면, 타겟 프레임워크를 4.0~4.5로 설정해 해당 DLL을 새로 빌드할 수 있어요. 직접 빌드가 어렵다면, 호환 가능한 버전의 DLL을 구해서 교체하는 방법도 있어요. 단, 신뢰할 수 있는 소스에서만 받는 게 중요해요.


이 오류, 처음 보면 좀 막막할 수 있지만… 사실 원리만 알면 어렵지 않아요.
핵심은 “PowerShell과 DLL의 .NET 런타임 버전이 맞아야 한다”는 점이에요.
그래서 가장 추천하는 방법은 PowerShell 7로 업그레이드하는 거고요.
그게 힘들다면, Expand-Archive 같은 기본 명령어로 우회하거나 DLL 자체를 낮은 버전으로 바꾸는 방법도 있어요.

저도 처음엔 별 생각 없이 스크립트만 복붙했다가 이 오류 만나서 한참 삽질했거든요 ㅎㅎ
혹시 여러분도 같은 상황이라면, 오늘 공유한 방법들 중 하나라도 꼭 적용해보세요.
그리고 여러분은 어떤 방식이 가장 편했는지 댓글로도 한번 공유해주시면 좋겠어요.
궁금한 점 있으면 언제든 질문 환영이에요!