質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

5回答

42892閲覧

exeとdllの作成に関して

abi-nitio

総合スコア37

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2015/11/13 14:27

VisualStudioを利用してビルドすると、exeもしくはdllが生成されると思います。

しかしながら、両者はどういった事由で作り分けられているのでしょうか。
Main関数があるのを判断したらexeになるなど、そんな浅い理解で良いのでしょうか。

また、コマンドラインで
csc /out:xxx.exeでexeを作成することができ、
csc /target:libraryでdllを作成することができるらしいのですが、
VisualStudioで、ビルド時に、このコマンドが自動的になされることで
exeやdlllが発生するのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
hsk

総合スコア728

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abi-nitio

2015/11/14 07:42

話がそれてしまうのですが、 上記のようなことから、Visualstudioでビルドボタンを押すということは、 cscコマンドを呼び出してきて、現在開いているソリューションに関連付けられるソースコードを引数に入れる、という過程を経てexeやdllが作成されるという理解でよろしいでしょうか。 ということは、作りましませんが、統合開発環境もやりようによっては自作できるのですね。。。
hsk

2015/11/15 14:35 編集

Visualstudioでビルドボタンを押すということは...のくだりは、おっしゃる通りですよ。 プロジェクト設定に従って、内部的にcsc(もしくは同等のコマンド)やそのほかのコマンドを呼び出しています。Visual StudioのようなIDE(統合開発環境)は、開発者とコマンドとの仲介をしているような存在です(設計やソースコードの記述に対する便宜も充実させてありますけれども)。 C言語の時代は、makefileと呼ばれる、コンパイルをどのようにしてほしいかを定義したファイルを開発者が書いて、makeコマンドやbuildコマンドを呼び出し、makeまたはbuildコマンドが、実際にバイナリを作成するas, lk, ar, cc コマンドなどを呼び出していました。今は、IDEがそれを代替してくれています。 統合開発環境も、もちろん自作できますよ!
guest

0

C#初心者なので、的はずれな部分もあるかもしれませんが…

C#のクラスライブラリについては下記ページの説明が分かりやすかったので、ぜひご参照ください。

クラスライブラリの作成

.NET Frameworkにおいては、実行可能ファイル(.exe)やライブラリ(.dll)はアセンブリという構成単位で扱われます。 アセンブリには、アプリケーションプロセスを起動するためのエントリポイント(Mainメソッド)を含む実行可能なアセンブリと、エントリポイントは持たずアプリケーションや他のライブラリから使用されるクラスを含むライブラリアセンブリがあります。 .NET Frameworkにおけるクラスライブラリは、ライブラリアセンブリとしてビルドされることになります。

つまり、『ソース的』に見れば、exedll の違いは エントリポイント である Mainメソッドを持っているかどうかの違いになると思います。

続きを見てゆくと、「コマンドラインでの作成手順」も「IDEでの作成手順と設定」も詳しく記載されていますので、分かりやすいと思います。

本来、Visual Studio でプロジェクトを新規作成する場合には、プロジェクトの種類を明示して作成します。ですから、IDE側の判断で勝手に作り分けられるというのは望むべき動作ではないはずですし、何を開発したいかは開発者自身が一番良く知っている訳ですから、プロジェクト作成時にどちらにすべきか選択できないということも無いはずです。
しかし、エントリポイント(Mainメソッド)が無ければ実行可能ファイル(exe)を作成し得ないので、(IDEが気を利かせて)クラスライブラリ(dll)が作成されるのだと思います。

なお、外部から呼び出したい部品を dll として作成することには、それなりに大きな意味があるようですので、参考となる説明のリンクを貼り付けておきます。

外から利用する場合の DLLとEXEの違いについて

exeを呼ぶ場合は、自分とは別プロセスになるので、メモリ空間も別です。
大きな情報を渡したい時に、直にポインタを使えませんので、工夫が要ります。
頻繁に交信を必要とする用途には良くはないと思います。

dllを呼ぶ場合は、自分と同じプロセス内にdllが読み込まれるので、メモリ空間は同じです。
大きな情報を渡したい時に、ポインタを使えます。
頻繁かつ多量な交信をする用途には良いと思います。

C#でプラグインDLLを作る方法(入門編)

…静的な参照では当然のことながら、ビルド時に参照しているアセンブリしか利用できません。これではプラグイン的なことができないので、「アセンブリのロード」と「クラスインスタンスの実体化」の2段階に分けて手順を説明します。

以上、幾らかでもご参考になれば幸いです。

投稿2015/11/14 03:33

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ざっくり言うと

  • exe:実行できるプログラム(Executableのexe)
  • dll:実行できるプログラムから使える部品(dynamic link libraryのdll)

みたいに考えればどうでしょう

exe形式かdll形式かは作成者側で決められますし、

  • dll:実行できるプログラムから使える部品

と書きましたが、参照設定すれば

  • exe:実行できるプログラム

も別のプログラムから使える部品として使うこともできます

投稿2015/11/13 20:48

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

abi-nitio

2015/11/13 23:11

更に教えてほしいです。 いままでソリューションをビルドしてdllを生成した試ししかないため聞いてしまいますが、exeファイルというのはどのようにして作成するのでしょうか。というのも、作り方くらいは調べますが、同じくソリューションをビルドするのになぜdllとexeに別れてしまうのでしょうか。 私の勘でしかありませんが、コンパイラがMain関数を検知するとexeとしてMain関数をメインプログラムとした実行ファイルの作成に走り、対してMain関数がない場合は、特にどれがメインプログラムなどは考えずにコンパイルされる、というなかんじで行われているのでしょうか。
dojikko

2015/11/14 01:07

私はVisualStudioしか使わないので、新規プロジェクトを作成・追加する際に〇〇Applicationを選択すればexeが、〇〇Libraryを選択すればdllが生成されるってレベルの理解です あとプロジェクトのプロパティのApplicationTypeを変更することでApplicationとClass Libraryの切り替えができ、StartupObjectでエントリポイントを変更できることくらいしか知りません [ダイナミックリンクライブラリ - Wikipedia](https://ja.wikipedia.org/wiki/ダイナミックリンクライブラリ)
guest

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
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

WindowsApplicationとして説明します。

プロジェクトのプロパティ →アプリケーション →出力の種類 を
【Windowsアプリケーション】
にすると「.exe」の実行形式でコンパイルされます。
【クラスライブラリ】
にすると「.dll」のライブラリ形式でコンパイルされます。

投稿2016/12/19 14:13

randr

総合スコア202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問