C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2007/11/10 02:54
指定した C# のソースコード ( 複数指定可 ) をメモリ上にコンパイルする関数。
アセンブリ名を省略した場合、ランダムな文字列が設定される。
当然、コンパイルされたクラスは PowerShell から即利用可能。

# 追記
(2007/11/10)

アセンブリ名を指定する場合は、アセンブリがファイルとして "%windir%\System32 " フォルダ内に保存されてしまう模様。そのため、一時ディレクトリに保存するよう修正。
(2007/11/11)
一時ディレクトリの後処理を忘れてたので追加。
# 追記ここまで

Compile-CSCode 関数
function global:Compile-CSCode
{
    param([String[]]$sources, [string[]]$referenceAssemblyNames, [String]$assemblyName)
    trap { break; }
   
    $tempDirectory = "$Env:Temp\PSCompile";
    if (!(Test-Path $tempDirectory))
    {
        New-Item $tempDirectory -ItemType "Directory" | Out-Null;
    }
    Remove-Item "$tempDirectory\*" -Recurse -Force;
   
    $codeProvider = New-Object "Microsoft.CSharp.CSharpCodeProvider";
    $parameters = New-Object "System.CodeDom.Compiler.CompilerParameters";
    $parameters.GenerateExecutable = $False;
    $parameters.GenerateInMemory = $True;
    $parameters.TreatWarningsAsErrors = $False;
    if (($() -ne $assemblyName) -and (0 -lt $assemblyName.Length))
    {
        $parameters.OutputAssembly = "$tempDirectory\$assemblyName";
    }
    if ($() -ne $referenceAssemblyNames)
    {
        $parameters.ReferencedAssemblies.AddRange($referenceAssemblyNames);
    }
   
    $result = $codeProvider.CompileAssemblyFromSource($parameters, $sources);
    if ($result.Errors.Count -ne 0)
    {
        $errorMessage = "コンパイルエラーが発生しました。`n";
        foreach ($err in $result.Errors)
        {
            $errorMessage += "{0}:{1}`n  Row:{2} Column:{3}`n" -f @($err.ErrorNumber, $err.ErrorText, $err.Line, $err.Column);
        }
        throw New-Object "ArgumentException" @($errorMessage);
    }
    return $result.CompiledAssembly;
}




使用例
$HogeCode =
@"
namespace Sample
{
    public class Hoge
    {
        public string Hello()
        {
            return "Hello World !";
        }
    }
}
"@;

$FugaCode =
@"
namespace Sample
{
    public class Fuga
    {
        public string GoodBye()
        {
            return "Goodbye World !";
        }
    }
}
"@;

$sources = @($HogeCode, $FugaCode);
$sampleAssembly = Compile-CSCode $sources;
$h = New-Object "Sample.Hoge";
$f = New-Object "Sample.Fuga";
$h.Hello();
$f.Goodbye();



続く・・・?
C# コードを PowerShell 上で使用する関数の注意点



【 ダウンロード 】
自作の PowerShell 関数は、以下の記事からまとめてダウンロードできます。

YokoKen.PowerShell.Scripts











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/178-ad7c7c8d