前提
条件が不足しているので、以下の要件からC# と仮定し、回答いたします。
- 言語に制約がない
- exe形式であるため、Windows環境で利用できるもの
- Windowsのバージョンは問われていない(XP以前は切り捨て)
概要
.NET ではCSharpCodeProvider - プログラムからソース・コードをコンパイルして実行するには? を用いて、.NETランタイムのみでソースコードからexeを生成することができます。
※CSharpCodeProvider はcscへのラッパーで、cscに対するコマンドをほぼ網羅しています。
ウイルス対策ソフトウェアとは不仲になる可能性がありますが、非常に有用な機能が盛り込まれています。
ノウハウ
いくつか注意点として、インメモリコンパイルを行った場合、構文エラーなどのコンパイルエラーの行数が分からなくなります。多数の人に使用してもらう場合は、エラーメッセージの考慮をする必要があります。
lineプラグマを使用して出力される行番号の制御を試みましたが、該当行を挿入することによる行数計算が狂うため、1行目にすべてを詰め込む手法が最善でした。
また、ビルドしたライブラリから外部アセンブリをコールしたいことがありますが、実行バイナリと同じディレクトリに配置するようにしてください。さもなくば、絶対パスで記載することになります。
ファイルを出力する場合、後始末をしたくなるでしょうが、一度読み込まれたライブラリやexeは、プロセスがなくなるまで、解放されません。これを回避するには、ビルドしてから実行する際に、プロセスを監視して、プロセスが消えたら関連するファイルを削除することで対応することが可能です。
AppDomainのアンロードについて考慮される方がいらっしゃるかもしれませんが、.NET 4.5において確認した結果、例外発生時にアンロードが不可能になる現象を確認しているため、あまりお勧めできません。ゲストAppDomain空間での例外が発生した場合に、遭遇しました(※)。回避策はなく、ゲストAppDomain空間で例外を握りつぶしても防げませんでした。
※pdbを削除することができなくなりました
参考1: Why isn’t there an Assembly.Unload method? - stackoverflow経由
参考2: AppDomain と動的読み込み
なお、CSharpCodeProvider を用いて、複数のファイルやクラスをビルドすることが可能です。