コンパイラを作る、といってもC#の場合必要なクラスはすでに用意されています。
あとはそのクラスをどう使うかという部分だけなので、たいした例ではないですがとりあえずコマンドラインコンパイラのサンプルです。
-------------------------------------------------------
using System;
using System.CodeDom.Compiler;
using System.IO;
using Microsoft.CSharp;
class send
{
static void Main(string [] args)
{
if(args.Length!=1 || !File.Exists(args[0]))
{
Console.WriteLine("引数に正しいファイル名を1つ与えてください。");
Console.Write("\r\n何かキーを押してください...");
Console.Read();
return;
}
ICodeCompiler cc = new CSharpCodeProvider().CreateCompiler();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.AddRange(
new string[] {
"mscorlib.dll",
"System.dll",
"System.Configuration.Install.dll",
"System.Data.dll",
"System.Design.dll",
"System.DirectoryServices.dll",
"System.Drawing.dll",
"System.EnterpriseServices.dll",
"System.Management.dll",
"System.Messaging.dll",
"System.Runtime.Remoting.dll",
"System.Runtime.Serialization.Formatters.Soap.dll",
"System.Security.dll",
"System.ServiceProcess.dll",
"System.Web.dll",
"System.Web.RegularExpressions.dll",
"System.Web.Services.dll",
"System.Windows.Forms.dll",
"System.Xml.dll"
});
cp.GenerateInMemory = true;
cp.GenerateExecutable = true;
cp.OutputAssembly = Path.ChangeExtension(args[0], ".exe");
CompilerResults cr = cc.CompileAssemblyFromFile(cp, args[0]);
if(cr.Errors.HasErrors)
{
foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.Line + "," + err.Column + ": " + err.ErrorText);
Console.Write("\r\n何かキーを押してください...");
Console.Read();
}
}
}
}
-------------------------------------------------------
とりあえず、Framework SDKが持っているすべてのdllを参照するようにしています。
上記サンプルをコンパイルすると、ソースファイルを1つ引数に与えると実行ファイルを生成してくれるコマンドラインコンパイラができあがります。
これで何がうれしい、ってもんでもないのですが、まぁこのコンパイラを利用すると以下のような利点があります。
- Windows98、MeなどSDKがインストールされていない環境でもコンパイルできる
- ファイルのドラッグ&ドロップでコンパイルできる
- SendToフォルダに置いておけば[右クリック]-[送る]からコンパイルできる
自分専用の開発環境を整えてみるのもいいかもしれません。
あおい情報システム株式会社 小野修司(どっとねっとふぁん)