明日から出張

 しばらく、家のマシンを起こせないので、用意をしながらちょっとCodeDOMを遊んでいました。

 .net framework 2.0 になって CodeDOM も統合されて使いやすくなりましたね。
 以前はコンパイルする言語ごとにコンパイル・プロバイダを生成していたのですが、今は、こんな感じです。

if ( !CodeDomProvider::IsDefinedLanguage(this->_source_type) )
{
  Console::WriteLine("{0} はコンパイラとしてサポートされていません。");
  return true;
}
CodeDomProvider^ code_provider = CodeDomProvider::CreateProvider(this->_source_type);
if ( code_provider == nullptr )
{
  Console::WriteLine("{0} のコンパイラを取得できません。");
  return true;
}

CompilerParameters^ para = gcnew CompilerParameters();
para->ReferencedAssemblies->Add("System.dll");
para->ReferencedAssemblies->Add(this->GetType()->Assembly->Location);
para->CompilerOptions = "/optimize";
para->OutputAssembly = String::Format("{0}\\{1}.dll", assembly_pos, this->_class_name);
para->GenerateInMemory = false;
CompilerResults^ result = code_provider->CompileAssemblyFromFile(para, sources);
if ( result->Errors->Count > 0 )
{
  Console::WriteLine("{0} のコンパイルに失敗しました。", sources);
  for each ( System::CodeDom::Compiler::CompilerError^ error in result->Errors )
  {
    if ( error->IsWarning )
    {
      Console::WriteLine("ワーニング : {0}", error->ErrorText);
    }
    else
    {
      Console::WriteLine("エラー : {0}", error->ErrorText);
    }
  }
  return true;
}
this->_assembly_path = result->PathToAssembly;

 CodeDomProvider::IsDefinedLanguage で指定されたキーワードがコンパイラでサポートしているかが取得できるので、言語を指定せずに済むところがいいですね。