アセンブリ名を省略した場合、ランダムな文字列が設定される。
当然、コンパイルされたクラスは 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