主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。

.NET で Exe 形式のファイルを出力する Exe を作る

最終更新日 2007-06-24 22:58:34 (1年以上前の記事です)

zip ファイルなどを圧縮した際に、自己解凍形式のファイルを出力するソフトとかあるじゃないですか。
あんな感じで exe ファイルを生成するソフトの .NET 版を作ってみたいなと思い、色々リサーチしてみたので、その時のメモ。
実は .NET には CSharpCodeProvider というとんでもないクラスが存在しているので、これを使ってみました。
今回開発した EnjoiCrypto にもこのテクは使っています。
一応環境。

.NET Framework 1.1/Mono 1.2

サンプルコード

とりあえずサンプルソースを見てもらうのが一番早いかと思う。
using System;
using System.IO;
using System.Resources;
using System.CodeDom.Compiler;
using Microsoft.CSharp;

namespace Test
{
    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {
            CSharpCodeProvider csprov = new CSharpCodeProvider();
            ICodeCompiler compiler = csprov.CreateCompiler();
            CompilerParameters compilerparams = new \
CompilerParameters(new string[] {"System.dll"}, \
"output.exe", false);
            compilerparams.GenerateExecutable = true;
            compilerparams.CompilerOptions = "/target:exe";

            CompilerResults cr = compiler.CompileAssemblyFromSource (compilerparams,
@"using System;

namespace Test
{
    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {" +
"            Console.WriteLine (\"Hello World\");" +
@"        }
    }
}");
        }
    }
}

コンパイルと実行

上記のソースを gmcs でコンパイルして実行してみましょう。
$ gmcs test.cs 
test.cs(20,29): warning CS0219: The variable `cr' is assigned but its value
is never used
test.cs(15,45): warning CS0618: 
`Microsoft.CSharp.CSharpCodeProvider.CreateCompiler()' 
is obsolete: `Use CodeDomProvider class'
Compilation succeeded - 2 warning(s)
$ ls
test.cs  test.exe
$ mono test.exe
$ ls
output.exe  test.cs  test.exe
$ mono output.exe
Hello World
どうやらうまくいっているようです。

解説

解説ですが、コードを見て分かるとおり、元のアプリは実行中に内部でコードをコンパイルしているわけです。

まずは CSharpCodeProvider は compiler オブジェクトを生成ます。
次に、コンパイル時のパラメータを指定するための CompilerParameters クラスのオブジェクトを生成し、ここに生成する Exe が必要な dll を指定したり、出力ファイルの名称、コンパイルオプション、リソースファイルがあればリソースを設定したりします。
そして最後に実際のコードを CompileAssemblyFromSource 関数でコンパイルしてできあがりです。

参考文献

Encrypt/Self Decrypt files in Native C++ and .NET
最終更新日 2007-06-24 22:58:34

コメント このエントリーをはてなブックマークに追加

フリーソフトウエア
EnjoiFLV
EnjoiPacket
EnjoiCrypto
ランキング
rank2, rank3, rank7, rank10, rank11
todo メモ
facebook 対応
ページ処理
RSS feed
検索機能
認証いる?
更新日表示
実はカテゴリ機能
多言語
実はユーザ機能
ソースその内公開
動作環境メモ
php-5.1.6 with PDO
SQLite-3.3
IE6
FireFox-1.5
RSS
非認証

検索
Google