VisualStudioを利用してビルドすると、exeもしくはdllが生成されると思います。
しかしながら、両者はどういった事由で作り分けられているのでしょうか。
Main関数があるのを判断したらexeになるなど、そんな浅い理解で良いのでしょうか。
また、コマンドラインで
csc /out:xxx.exeでexeを作成することができ、
csc /target:libraryでdllを作成することができるらしいのですが、
VisualStudioで、ビルド時に、このコマンドが自動的になされることで
exeやdlllが発生するのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
こんにちは。
「Main関数があるのを判断したらexe」と判断しているのではなく、「exeをビルドするように」「dllをビルドするように」と、開発者がコンパイラに指示をしています。質問者さんが調べられたコマンドラインオプションがそれです。
VisualStudioであれば、開発者がプロジェクト作成時に指定したプロジェクト設定をもとにcscへふさわしいオプションを渡したりしています。
Qiita : Visual Studioではなく、Windows付属のcsc.exe だけでC#実行ファイルを作る
exeファイルを作るようオプション指定されたとき、main関数のようなエントリポイントの記述がなければコンパイルエラーになります。main関数がないからdllに...とはなりません。
投稿2015/11/14 06:10
編集2015/11/14 06:16総合スコア728
0
C#初心者なので、的はずれな部分もあるかもしれませんが…
C#のクラスライブラリについては下記ページの説明が分かりやすかったので、ぜひご参照ください。
.NET Frameworkにおいては、実行可能ファイル(.exe)やライブラリ(.dll)はアセンブリという構成単位で扱われます。 アセンブリには、アプリケーションプロセスを起動するためのエントリポイント(Mainメソッド)を含む実行可能なアセンブリと、エントリポイントは持たずアプリケーションや他のライブラリから使用されるクラスを含むライブラリアセンブリがあります。 .NET Frameworkにおけるクラスライブラリは、ライブラリアセンブリとしてビルドされることになります。
つまり、『ソース的』に見れば、exe と dll の違いは エントリポイント である Mainメソッドを持っているかどうかの違いになると思います。
続きを見てゆくと、「コマンドラインでの作成手順」も「IDEでの作成手順と設定」も詳しく記載されていますので、分かりやすいと思います。
本来、Visual Studio でプロジェクトを新規作成する場合には、プロジェクトの種類を明示して作成します。ですから、IDE側の判断で勝手に作り分けられるというのは望むべき動作ではないはずですし、何を開発したいかは開発者自身が一番良く知っている訳ですから、プロジェクト作成時にどちらにすべきか選択できないということも無いはずです。
しかし、エントリポイント(Mainメソッド)が無ければ実行可能ファイル(exe)を作成し得ないので、(IDEが気を利かせて)クラスライブラリ(dll)が作成されるのだと思います。
なお、外部から呼び出したい部品を dll として作成することには、それなりに大きな意味があるようですので、参考となる説明のリンクを貼り付けておきます。
exeを呼ぶ場合は、自分とは別プロセスになるので、メモリ空間も別です。
大きな情報を渡したい時に、直にポインタを使えませんので、工夫が要ります。
頻繁に交信を必要とする用途には良くはないと思います。dllを呼ぶ場合は、自分と同じプロセス内にdllが読み込まれるので、メモリ空間は同じです。
大きな情報を渡したい時に、ポインタを使えます。
頻繁かつ多量な交信をする用途には良いと思います。
…静的な参照では当然のことながら、ビルド時に参照しているアセンブリしか利用できません。これではプラグイン的なことができないので、「アセンブリのロード」と「クラスインスタンスの実体化」の2段階に分けて手順を説明します。
以上、幾らかでもご参考になれば幸いです。
投稿2015/11/14 03:33
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ざっくり言うと
- exe:実行できるプログラム(Executableのexe)
- dll:実行できるプログラムから使える部品(dynamic link libraryのdll)
みたいに考えればどうでしょう
exe形式かdll形式かは作成者側で決められますし、
- dll:実行できるプログラムから使える部品
と書きましたが、参照設定すれば
- exe:実行できるプログラム
も別のプログラムから使える部品として使うこともできます
投稿2015/11/13 20:48
総合スコア3939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
両者はどういった事由で作り分けられているのでしょうか。
根本的な目的は計算機のメモリーの節約です。
EXEファイルはOSから新たなプロセスを生成した上で動かすプログラムファイルですが、多くの異なるEXEファイルは共通のライブラリーを用いることが多いです。そうした場合に全部のプログラムに同じライブラリーをリンクしてしまうと「ライブラリー部分のプログラムの内容が同じなのに」計算機のメモリー上ではそれらが個別に別の領域を占有してしまいます。
+---------+ |A.EXE |200KB |Win32.LIB|100KB +---------+ +---------+ |B.EXE |300KB |Win32.LIB|100KB +---------+ //合計700KB
一方でDLLファイルとしてEXEファイルからは独立させると、複数のプログラムから同じDLLが参照された場合、それらのDLLは計算機のメモリー上で自動的に同一の領域に割り当てられるためにメモリーの節約になるのです。
+---------+ |A.EXE |200KB +---------+ +---------+ |B.EXE |300KB +---------+ +---------+ |Win32.DLL|100KB +---------+ //合計600KB...100KBのお得(同時に動くEXEの数が多いほどお得)
Windowsに限らず他の多くのマルチプリエンプティブOSであるUnix(やその兄弟?のLinux,Machintosh)でも同様です。うまいアイデアはみんな似たことをするわけですね。
投稿2016/12/20 13:25
編集2016/12/20 13:26総合スコア18404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/14 07:42
2015/11/15 14:35 編集