Here's the problem ...
I have a CmdLet Powershell that works when working in 32-bit mode and does not work in 64-bit mode. The question is what is the cause and how can it be fixed.
Situation
Powershell CmdLet refers to "OutlookHelper.Common.dll". The newest version 2.0.0.0 CmdLet also uses logging and links "Logging.dll".
Logging.dll also refers to "OutlookHelper.Common.dll", it has only been compiled against version 1.0.0.0.
How I did it, it partially works
Using assembly binding redirection in a Powershell application configuration file:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0.30319"/> <supportedRuntime version="v2.0.50727"/> </startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="OutlookHelper.Common" publicKeyToken="5e4553dc0df45306"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
32-bit Powershell versions work fine
When working on a 64-bit machine using "Windows Powershell (x86)", it works. The assembly manager detects assembly binding redirection:
The operation was successful. Bind result: hr = 0x0. The operation completed successfully. Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = MYDOMAIN\testuser LOG: DisplayName = OutlookHelper.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5e4553dc0df45306 (Fully-specified) LOG: Appbase = file:///C:/Windows/syswow64/Windowspowershell/v1.0/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = powershell.exe Calling assembly : OutlookHelper.Data.Common, Version=1.0.5295.26925, Culture=neutral, PublicKeyToken=null. === LOG: This bind starts in LoadFrom load context. WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). LOG: Using application configuration file: C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe.Config LOG: Using host configuration file: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Redirect found in application configuration file: 1.0.0.0 redirected to 2.0.0.0. LOG: Post-policy reference: OutlookHelper.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5e4553dc0df45306 LOG: GAC Lookup was unsuccessful. LOG: Attempting download of new URL file:///C:/Windows/syswow64/Windowspowershell/v1.0/OutlookHelper.Common.DLL. LOG: Attempting download of new URL file:///C:/Windows/syswow64/Windowspowershell/v1.0/OutlookHelper.Common/OutlookHelper.Common.DLL. LOG: Attempting download of new URL file:///C:/Windows/syswow64/Windowspowershell/v1.0/OutlookHelper.Common.EXE. LOG: Attempting download of new URL file:///C:/Windows/syswow64/Windowspowershell/v1.0/OutlookHelper.Common/OutlookHelper.Common.EXE. LOG: Attempting download of new URL file:///D:/SampleApps/_Common/Bin/Outlook.Extensions.Sample/OutlookHelper.Common.DLL. LOG: Assembly download was successful. Attempting setup of file: D:\SampleApps\_Common\Bin\Outlook.Extensions.Sample\OutlookHelper.Common.dll LOG: Entering run-from-source setup phase. LOG: Assembly Name is: OutlookHelper.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=5e4553dc0df45306 LOG: Where-ref bind Codebase does not match what is found in default context. Keep the result in LoadFrom context. LOG: Binding succeeds. Returns assembly from D:\SampleApps\_Common\Bin\Outlook.Extensions.Sample\OutlookHelper.Common.dll. LOG: Assembly is loaded in LoadFrom load context.
Here's what Powershell says about build identity:
Windows PowerShell (x86) Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\testuser> ([xml](gc $([System.AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile))).configuratio n.runtime.assemblyBinding.dependentAssembly.assemblyIdentity name publicKeyToken ---- -------------- OutlookHelper.Common 5e4553dc0df45306 PS C:\Users\testuser>
This is where the problem begins ...
When working on a 64-bit machine using "Windows Powershell" it does not work. The assembly manager does NOT find the assembly binding redirection:
The operation failed. Bind result: hr = 0x80070002. The system cannot find the file specified. Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll Running under executable C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = MYDOMAIN\testuser LOG: DisplayName = OutlookHelper.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5e4553dc0df45306 (Fully-specified) LOG: Appbase = file:///C:/WINDOWS/system32/WindowsPowerShell/v1.0/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = powershell.exe Calling assembly : OutlookHelper.Data.Common, Version=1.0.5295.26925, Culture=neutral, PublicKeyToken=null. === LOG: This bind starts in LoadFrom load context. WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). LOG: Using application configuration file: C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe.Config LOG: Using host configuration file: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config. LOG: Post-policy reference: OutlookHelper.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5e4553dc0df45306 LOG: The same bind was seen before, and was failed with hr = 0x80070002. ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
Here's what Powershell says about build identity:
Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\testuser> ([xml](gc $([System.AppDomain]::CurrentDomain.SetupInformation.ConfigurationFile))).configuratio n.runtime.assemblyBinding.dependentAssembly.assemblyIdentity PS C:\Users\ccontent01>
When I let Powershell get the contents of my own application configuration file, I get the following output:
Windows PowerShell Copyright (C) 2009 Microsoft Corporation. All rights reserved. PS C:\Users\testuser> gc C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe.Config <?xml version="1.0"?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0.30319"/> <supportedRuntime version="v2.0.50727"/> </startup> </configuration> PS C:\Users\testuser>
What have I tried ...
- Check if the "Specific Version" is set to "false" -> it is.
- The deleted and re-added application configuration file → did not fix it.
- I started working with a new application configuration file in the SysWOW64 folder → did not fix it.
- Double check the contents of downloaded files (powershell.exe.Config and machine.config) → they are the same.
My suggestion
- The assembly manager cannot find the assembly redirection binding.
Any solutions?
- Why doesn't the Fusion log for a 64-bit instance mention something like "Redirection found in application configuration file: 1.0.0.0 redirected to 2.0.0.0."?
- What could be causing this?
- Can you think of any solutions?