C#でLIBをEXEにマージして一つにまとめる「ILMerge」

C#
CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 100

「ILMerge」について

最初に

余談ですが・・・

本題に入る前に余談ですが・・・

「C#」は、”シーシャープ”でいいのでしょうか?

パソコンでも使っていた「#」は、ツイッターで「ハッシュタグ」と呼ばれるようになって、「実はシャープではなくハッシュが正解」だったと聞きました。

ならば、”シーハッシュ”?なのでしょうか?

♯:シャープは横棒が斜め

#:ハッシュは横棒が真横

まあ、どっちでも良いのですが。(笑

実は、CとC++は仕事でも使って開発をしていたのですが、C#は仕事をやめてから覚えました。

個人的にはポインタ関係が無いので、「コーディングが若干異なるVB」という印象なのですが。

いずれにせよ、あまり得意とは言えない言語なのですが、仕事をやめてからちょっとしたツール作りに「C#」を使うようになったので、気になることがあれば少しづつでも記事をかけたらなと思っています。

きっけかは勘違い・・・!?

プログラムを作り、作ったプログラムを別のフォルダにコピーして使っているのですが、プロジェクトによってDLLが大量に存在しているのが気になりました。

ファイル名を見て、「 .NET Framework 」のDLLだと言うことは直ぐにわかったのですが、「正直、邪魔」「なんとかならないのかな?」という感想でした。

最初は我慢して使っていたのですが、ちょっと調べてみようと思い立ち、調べたところ「ILMerge」というツールを使えばEXEの中にDLLをマージしてEXEファイルだけにすることが出来るとわかりました。

マージする方法などを調べたので方法を解説します。

しかし・・・

結論から言えば、「.NET Framework」をインストールしている環境では「不要」でした。

作成したプログラムからEXEだけをコピーして動作させると問題なく動作しました。

恐らく、作成したプログラムを配布するなどで、.NET Frameworkが無い環境でも動作させるために必要なようです。

ただ、一部のプロジェクトではDLLを使っているものが存在するので、そういうプログラムでは有効に使えるかも・・・。

「ILMerge」とは。

「ILMerge」は、EXEの中にDLLを入れ込んでEXEファイル一つにまとめる事が出来るツールです。

NuGetを検索すると色々な便利なツールが存在し、その中にはDLLで提供されたものも多くあります。

それらを使った場合、自分が作成したEXEとは別にDLLが必要になりますが、配布などをする場合に複数のファイルに分割されていることがじゃまになる場合もあります。

もちろん一長一短なので、どちらにも「良い点」「悪い点」があるので、EXEにまとめることが必ずしも良いわけではありません。

しかし、プログラムを分割する方法は色々とありますが、まとめる方法はなかなか見かけないこと?なのではと思い、自身の備忘録もかねて記事にします。

「ILMerge」は、「Mike Barnett」さんが開発したソフトで、以前はマイクロソフトダウンロードセンターでもダウンロード出来ていたようです。

現在は、オープンソフトとしてGitHubで公開されています。

GitHub - dotnet/ILMerge: ILMerge is a static linker for .NET Assemblies.
ILMerge is a static linker for .NET Assemblies. Contribute to dotnet/ILMerge development by creating an account on GitHu...

ライセンスはMITライセンスです。

「ILMerge」だけでマージは可能なのですが、今回はプログラムをコンパイルすると自動でマージしたEXEを作成してくれる「ILMerge.MSBuild.Task」もインストールしました。

こちらは、NuGet Galleryで公開されています。

ILMerge.MSBuild.Task 1.0.7
Adds ILMerge to Visual Studio 2013/2017 or automated builds. This Task is intended to work right out of the box however ...

こちらは開発者が異なり「Emerson Brito」さんが開発されています。

インストール

Visual Studio Community 2017」でのインストール方法を解説します。

バージョンが異なる場合は、適宜読み替えてください。

目的のソリューションを開き、「ツール」-「NuGetパッケージマネージャ」-「ソリューションのNugetパッケージの管理」をクリックします。

「パッケージの管理」画面が開いたら、「参照」をクリックして「ILMerge」を入力します。

表示される一覧から「ILMerge」をクリックし、インストールしたいプロジェクトのラジオボタンにチェックを入れて「インストール」をクリックします。

「ライセンスの同意」画面が開きます。ライセンスを確認したら「同意する」をクリックします。

今回は、「ILMerge.MSBuild.Task」もインストールしますので、同様に探してインストールします。

「ビルド」して、DLL内包のEXEを作成する。

通常通りの方法で「ビルド」します。

すると、デバッグやリリースのフォルダに「ILMerge」フォルダが作成されます。

このフォルダの中にDLLを内包したEXEファイルが作成されています。

VisualStudioにインストールした「ILMerge」だけでは、GitHubのページの下の方に解説があるように「****.csproj」ファイルを書き換えたり、バッチファイルでプログラムを実行させたり、ビルドイベントに処理を書き込んだりしなければDLLを内包したEXEファイルは作成出来ませんが、「 ILMerge.MSBuild.Task 」をインストールした事で、タスクの登録が行われるので通常のビルドだけで作成されてしまいます。

最後に・・・

GitHubの解説でバッチファイルを作成してDLL内包EXEの作成方法が解説されていたので、実際にNuGetする前にバッチファイルで実際にEXEを作成してテストしてから導入しようと思ったのですが、残念ながら実行モジュールが見つからなかったので導入してテストしました。

しかし、NuGetするとプロジェクトフォルダの中に実行モジュールがインストールされるのでバッチを使ってEXEの作成が可能になります。

実際にバッチでの作成もテストしたので、機会があれば記事にしたいと考えています。

プログラムを色々作っていく中で、便利な記述や、忘れたくない記述などをクラスにまとめ、参照リンクの形で色々なソリューションで共有しています。

ある程度まとまったら、DLLにしたほうが便利かなと思っています。

(今回、その事も頭の隅にあったので、この記事を作成しました。)

なので、それらに関しても記事に出来たらな。と思っています。

タイトルとURLをコピーしました