Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add-Type: Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found

I am using simple PowerShell script in TeamCity Builds.

It requires System.IO.Compression.FileSystem and the agent has .NET 4.5.2 installed. Below are the .NET frameworks installed

PSChildName         Version             Release             Product            
-----------         -------             -------             -------            
v2.0.50727          2.0.50727.5420                                             
v3.0                3.0.30729.5420                                             
Windows Communic... 3.0.4506.5420                                              
Windows Presenta... 3.0.6920.5011                                              
v3.5                3.5.30729.5420                                             
Client              4.5.51209           379893              4.5.2              
Full                4.5.51209           379893              4.5.2              
Client              4.0.0.0                                    

The PowerShell script has following line

[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");
Add-Type -AssemblyName System.IO.Compression.FileSystem

On the second line, the execution fails with error

Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.
At C:\BuildAgent\someFile.ps1:104 char:13
+     Add-Type <<<<  -AssemblyName System.IO.Compression.FileSystem
+ CategoryInfo          : ObjectNotFound: (System.IO.Compression.FileSystem:String) [Add-Type], Exception
+ FullyQualifiedErrorId : ASSEMBLY_NOT_FOUND,Microsoft.PowerShell.Commands.AddTypeCommand

Strange, but I expected that with .NET 4.5.2, PowerShell should be able to load assembly from GAC

Any help will be appreciated

like image 647
GeekzSG Avatar asked Apr 20 '16 08:04

GeekzSG


2 Answers

Try to load particular DLL instead:

Add-Type -Path C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.IO.Compression.FileSystem\v4.0_4.0.0.0__b77a5c561934e089\System.IO.Compression.FileSystem.dll
like image 86
Kirill Pashkov Avatar answered Oct 05 '22 23:10

Kirill Pashkov


LoadWithPartialName() is obsolete'd, so avoid it when you can; however since LoadWithPartialName() is already working in your context, you could also use the Location property from the object that is returned to load the DLL.

if($PSVersionTable.PSVersion -lt '5.0'){
   Add-Type -Path ([Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")).Location;
}else{
   Add-Type -AssemblyName System.IO.Compression.FileSystem
}
like image 36
Gregor y Avatar answered Oct 05 '22 23:10

Gregor y