Как использовать add-type с -path, а также -language csharpversion3? - PullRequest
3 голосов
/ 29 марта 2011

Я использовал add-type в Powershell для динамической компиляции в некоторых классах C #, которые я хочу использовать. Прекрасно работает, кроме версии 2.0.

Я только что обнаружил опцию -language csharpversion3, но она не работает с -path. Как я могу обойти это?

[Редактировать: удален бит о ReadAllText - я ошибся.]

Ответы [ 2 ]

5 голосов
/ 30 марта 2011

Вот обходной путь: прочитайте файл как текст.

$script = [io.file]::readalltext($scriptpath)
add-type $script -lang csharpversion3

Я мог бы также вставить остальное и каким-то образом сделать этот ответ полезным. У меня есть флаг отладки, который позволяет мне генерироватьDLL, так что я могу легко обойтись с отладчиком, проверить его с помощью Reflector и т. Д.

$cp = new-object codedom.compiler.compilerparameters
$cp.ReferencedAssemblies.Add('system.dll') > $null
$cp.ReferencedAssemblies.Add('system.core.dll') > $null

# optionally turn on debugging support
if ($debugscript)
{
    # delete old unused crap while we're at it
    dir "$($env:temp)\-*.dll" |%{
        del $_ -ea silentlycontinue
        if ($?) { del $_.fullname.replace('.dll', '.pdb') -ea silentlycontinue }
    }

    $cp.TreatWarningsAsErrors = $true
    $cp.IncludeDebugInformation = $true
    $cp.OutputAssembly = $env:temp + '\-' + [diagnostics.process]::getcurrentprocess().id + '.dll'
}

$script = [io.file]::readalltext($scriptpath)
add-type $script -lang csharpversion3 -compilerparam $cp

Это добавляет некоторые дополнительные функции, если для $ debugscript установлено значение true:

  • Компилировать с предупреждениями в виде ошибок
  • Создать PDB
  • Использовать определенное имя DLL / PDB (во временной папке), которое привязано к идентификатору процесса, чтобы каждый сеанс получал свой собственный.Это хорошо для итерации изменений в .cs.
  • Удаляет старые dll и pdb, также хорошо при итерации.
4 голосов
/ 29 марта 2011

Не знаю, действительно ли вам это нужно, но вы можете включить поддержку .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

Удачи и удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...