This post is about changing the configuration of a managed application to load the correct .net framework.
.Net assemblies can be load using the command:
Add-Type -Path ./MyDotNetAssembly.dll
The last versions of Visual Studio build .net assemblies for .Net Framework version 4.0 or higher. By default, PowerShell uses the .Net Framework version 2.0 run-time, and then you get the following error message in PowerShell:
Add-Type : Could not load file or assembly 'file:///C:\...\MyDotNetAssembly.dll' or one of its dependencies. This assembly is built by a runtime newer than the currently loaded runtime and cannot be loaded.
At line:1 char:13
+ Add-Type -Path .\MyDotNetAssembly.dll
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (:) [Add-Type], BadImageFormatException
+ FullyQualifiedErrorId : System.BadImageFormatException,Microsoft.PowerShell.Commands.AddTypeCommand
To resolve this problem you can change the config file of PowerShell to let it
load the .Net Framework version 4.0 instead of version 2.0. This can be
done using the PowerShell.exe.config
file. Locate the program
PowerShell.exe
which is typically
C:\windows\System32\WindowsPowerShell\v1.0
, and create/update the file
PowerShell.exe.config
beside it, with this configuration:
<?xml version="1.0">
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
On 64-bit machines, the location of 64-bit of PowerShell is the same, but
the 32-bit version of PowerShell is located under
C:\windows\SysWOW64\WindowsPowerShell\v1.0
.
When you use the 32-bit version of PowerShell, you should create/change the
config file there too.
The same trick can be applied to other software that hosts PowerShell, such as
PowerShell_ISE.exe
. All you need is create a application.exe.config
configuration file beside application.exe
.