Ответ 1
Powershell использует политику издателя (см. здесь), чтобы автоматически перенаправить хосты, созданные против Powershell 2, в среду исполнения Powershell 3, если она доступна.
В большинстве случаев это именно то, что вы хотите, однако вы можете явно отключить политику издателя, если это необходимо для вашего приложения.
Поместите это в свой файл app.config, чтобы отключить политику издателя для System.Management.Automation(время выполнения powershell):
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Management.Automation" publicKeyToken="31bf3856ad364e35" />
<publisherPolicy apply="no" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Тестирование (консольное приложение, ориентированное на .NET 4.0, с явной ссылкой на среду выполнения PS v2):
PowerShell ps = PowerShell.Create();
ps.AddScript("$psversiontable");
var result = ps.Invoke()[0].BaseObject as Hashtable;
Console.WriteLine("Powershell version: {0}", result["PSVersion"]);
Console.WriteLine(".NET version: {0}", typeof(string).Assembly.GetName().Version);
Запустив это на моем ящике Win8 (там определенно PSv3), я получаю результат
Powershell version: 2.0
.NET version: 4.0.0.0
И версия PS идет до 3.0, если я комментирую app.config.