Не знаю, действительно ли вам это нужно, но вы можете включить поддержку .NET 4 в powershell.Помните, что по умолчанию он использует .NET 2. Для этого вам нужно добавить в $ PSHome XML-файл с именем powershell.exe.config и следующим содержанием:
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
После этого любой код, предназначенный длябудет работать более крупная версия .net, например:
Slytherin>> gc new.cs
using System.IO;
public static class testeo
{
public static string joinP(string[] arr)
{
return Path.Combine(arr);
}
}
Slytherin>> $arr = "uno", "dos", "tres", "cuatro", "cinco"
Slytherin>> Add-Type -Path .\new.cs
Slytherin>> [testeo]::joinP($arr)
uno\dos\tres\cuatro\cinco
Этот метод использует Path.Combine с N аргументами, определенными в .NET4.В .NET2 Combine может обрабатывать только два аргумента.Я тестирую другой пример, в котором используются анонимные делегаты, одна из характеристик C # 3:
Slytherin>> $sharp = [IO.file]::readalltext((resolve-path new.cs))
Slytherin>> add-type -typedef $sharp -Language CsharpVersion3
Slytherin>> gc .\new.cs
using System.IO;
using System;
using System.Linq;
namespace grantest
{
public static class testeo
{
public static void joinP(string[] arr)
{
arr.ToList<string>().ForEach(x=>Console.WriteLine(x));
}
}
}
Slytherin>> [grantest.testeo]::joinP($arr)
uno
dos
tres
cuatro
cinco
Slytherin>>
Последний пример, если вы попробуете следующий код, он не будет работать
Slytherin>> $sharp = [IO.file]::readalltext((resolve-path new.cs))
Slytherin>> $sharp
using System.IO;
using System;
using System.Linq;
namespace grantest
{
public static class testeo4
{
public static string joinP(string[] arr)
{
arr.ToList<string>().ForEach(x=>Console.WriteLine(x));
return Path.Combine(arr);
}
}
}
Slytherin>> Add-Type -TypeDefinition $sharp
Add-Type : c:\Users\voodoomsr\AppData\Local\Temp\5ikkmpfn.0.cs(3) : The type or namesp
ace name 'Linq' does not exist in the namespace 'System' (are you missing an assembly
reference?)
c:\Users\voodoomsr\AppData\Local\Temp\5ikkmpfn.0.cs(2) : using System;
c:\Users\voodoomsr\AppData\Local\Temp\5ikkmpfn.0.cs(3) : >>> using System.Linq;
c:\Users\voodoomsr\AppData\Local\Temp\5ikkmpfn.0.cs(4) :
At line:1 char:9
+ Add-Type <<<< -TypeDefinition $sharp
+ CategoryInfo : InvalidData: (c:\Users\voodoo...bly reference?):Compile
rError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddType
Command
другой попробуйте указать параметр языка
Slytherin>> add-type -TypeDefinition $sharp -Language CSharpVersion3
Add-Type : c:\Users\voodoomsr\AppData\Local\Temp\v3r5whoc.0.cs(13) : No overload for m
ethod 'Combine' takes '1' arguments
c:\Users\voodoomsr\AppData\Local\Temp\v3r5whoc.0.cs(12) : arr.ToList<string>()
.ForEach(x=>Console.WriteLine(x));
c:\Users\voodoomsr\AppData\Local\Temp\v3r5whoc.0.cs(13) : >>> return Path.Comb
ine(arr);
c:\Users\voodoomsr\AppData\Local\Temp\v3r5whoc.0.cs(14) : }
At line:1 char:9
+ add-type <<<< -TypeDefinition $sharp -Language CSharpVersion3
+ CategoryInfo : InvalidData: (c:\Users\voodoo...s '1' arguments:Compile
rError) [Add-Type], Exception
+ FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddType
Command
Это происходит потому, что при использовании метода .net4 и, очевидно, если вы говорите, что язык версии 3, автоматически используются библиотеки .net 3.Чтобы сделать это, вам нужно добавить System.Core в качестве сборочной сборки и забыть о параметре языка (у перечисления возможных значений нет Csharpversion4), поэтому он будет использовать версию 4, потому что мы включили его раньше.
Slytherin>> Add-Type -TypeDefinition $sharp -ReferencedAssemblies System.core
Slytherin>> [grantest.testeo4]::joinP($arr)
uno
dos
tres
cuatro
cinco
uno\dos\tres\cuatro\cinco
Удачи и удачного кодирования.