C#のコードで動的にクラスをコンパイルして使用する

コードの実行中に、ソースコードをランタイムで動的にコンパイルして実行する方法。


using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System;
using System.Collections;
using System.ComponentModel;
using System.IO;
using System.Reflection;
using System.Text;

中略

CSharpCodeProvider provider = new CSharpCodeProvider();
ICodeCompiler compiler = provider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;

//実行中のアセンブリと同じ参照設定をおこなう
Assembly asm = Assembly.GetExecutingAssembly();
parameters.ReferencedAssemblies.Add(asm.Location);
AssemblyName[] assemblyNames = asm.GetReferencedAssemblies();
foreach(AssemblyName asmName in assemblyNames)
{
if(asmName.Name.StartsWith("System") || asmName.Name.StartsWith("mscorlib") )
{
parameters.ReferencedAssemblies.Add(asmName.Name + ".dll");
}
else if(asmName.Name.StartsWith("Oracle"))
{
Assembly oraAsm = Assembly.Load(asmName);
parameters.ReferencedAssemblies.Add(oraAsm.Location);

}
else
{
parameters.ReferencedAssemblies.Add(binPath + asmName.Name + ".dll");
}
Trace.Write(asmName.FullName);
}

//コンパイル実行
CompilerResults results = compiler.CompileAssemblyFromSource(parameters,src);
if(results.Errors.HasErrors)
{
StringBuilder sbErrorMsg = new StringBuilder();
foreach(CompilerError error in results.Errors)
{
sbErrorMsg.Append(error.ErrorText).Append(" 行:").Append(error.Line).Append(" 列:").Append(error.Column).Append("\r\n");
}
txtCompileErrors.Text = sbErrorMsg.ToString();
return;
}
txtCompileErrors.Text = "";

//コンパイルされたアセンブリ、クラスの取得
Assembly compiledAssembly = results.CompiledAssembly;

Type casperType = compiledAssembly.GetType("ClassName");
object casper = casperType.GetConstructor(Type.EmptyTypes).Invoke(null);

C#からMeCabを使ってみる

障害管理用のデータベースの内容を解析して、障害原因の傾向を分析するためにMeCabを使ってみた。
参考にしたのは、こちら。
http://mitc.xrea.jp/diary/044


基本的にはこのサイトに書いてあるとおり。
使ってみて気になったのは、


ループの中でTagger.parse()を繰り返し呼ぶとMeCabがエラーで落ちてしまった。
(とりあえず、毎回Taggerインスタンスを生成することで回避できた)


MeCab本体のマニュアルに未知語の処理の変更方法等が載っているが、Windows版のインストーラには、
ipadicの元データが含まれていないので、別途入手する必要があった。
この元データ(csv)はeuc-jpになっているが、Windows版のバイナリで辞書を再構築しようとすると、
shift-jisに変換できないとおこられたので、一度shift-jisに変換するとうまくいくようになった。