明日から出張
しばらく、家のマシンを起こせないので、用意をしながらちょっと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 で指定されたキーワードがコンパイラでサポートしているかが取得できるので、言語を指定せずに済むところがいいですね。