C#のexeとdllの違いとは?作成・参照・実行方法まで初心者向けに解説

はじめに

C#でアプリケーションを作っていると、必ずといってよいほど出てくるのが「exe」と「dll」です。

「exeは実行ファイル」「dllはライブラリ」と聞いたことがあっても、実際にC#で開発していると、次のような疑問が出てきます。

「C#で作ったexeとdllは何が違うのか」
「dllは単体で実行できるのか」
「exeからdllを参照するにはどうすればよいのか」
「Visual Studioやdotnetコマンドでは、どのようにexeやdllが作られるのか」

この記事では、C#におけるexeとdllの違いを、初心者にもわかりやすく解説します。作成方法、参照方法、実行方法、よくあるエラー、実践サンプルまで順番に見ていきましょう。

1. C#のexeとdllの違いを初心者向けにわかりやすく解説

C#のexeとdllの違いを理解するには、まず「何のためのファイルなのか」を押さえることが大切です。

簡単に言うと、exeはアプリケーションとして起動するためのファイルで、dllは他のプログラムから呼び出して使う部品のようなファイルです。

1-1. exeとは?単体で実行できるアプリケーションファイル

exeは「Executable file」の略で、実行可能ファイルを意味します。

Windowsでは、拡張子が「.exe」のファイルをダブルクリックすると、アプリケーションが起動します。たとえば、メモ帳や電卓、ゲーム、業務システムなど、ユーザーが直接起動するプログラムの多くはexeファイルです。

C#でも、コンソールアプリやWindowsアプリを作成すると、基本的にexeファイルが作られます。

たとえば、次のようなアプリはexeとして作成されます。

  • コマンドプロンプトで動くコンソールアプリ

  • Windows Formsアプリ

  • WPFアプリ

  • デスクトップツール

  • バッチ処理用の実行プログラム

exeには、プログラムの開始地点が必要です。C#では通常、Mainメソッドがその役割を持ちます。Mainメソッドから処理が始まり、必要に応じて別のクラスやdllを呼び出します。

1-2. dllとは?他のプログラムから呼び出して使うライブラリファイル

dllは「Dynamic Link Library」の略で、動的リンクライブラリを意味します。

dllは単体で起動するアプリケーションではなく、他のexeやdllから参照されて使われる部品です。共通処理をまとめたり、複数のプロジェクトで同じ機能を再利用したりするために使われます。

たとえば、次のような処理はdllにまとめることが多いです。

  • 消費税計算

  • 文字列チェック

  • ファイル操作

  • データベース接続処理

  • ログ出力

  • API通信処理

  • 業務ロジック

  • 共通の画面部品

dllにしておくと、複数のexeから同じ処理を呼び出せます。たとえば「販売管理アプリ」と「在庫管理アプリ」の両方で同じ計算処理を使いたい場合、その処理をdllにまとめると再利用しやすくなります。

1-3. exeとdllの役割の違いを一覧表で比較

C#のexeとdllの違いを表にすると、次のようになります。

項目exedll
主な役割アプリケーションとして実行する他のプログラムから呼び出される
単体実行基本的に可能基本的に不可
開始地点Mainメソッドが必要通常はMainメソッド不要
使用例コンソールアプリ、Windowsアプリクラスライブラリ、共通処理
呼び出し方ユーザーやOSが起動するexeや他のdllが参照する
再利用性アプリ単位で使う複数プロジェクトで使いやすい
拡張子.exe.dll

初心者向けにたとえるなら、exeは「完成した家」、dllは「家を作るための部品」です。家そのものは人が使うものですが、部品は家の中で使われて初めて役割を果たします。

1-4. C#ではexeもdllも.NETアセンブリとして扱われる理由

C#で作成されるexeやdllは、どちらも.NETアセンブリとして扱われます。

アセンブリとは、.NETで実行・参照されるプログラムの単位です。C#のコードをビルドすると、コンパイラによって中間言語であるILやメタデータを含むファイルが生成されます。この生成物がexeやdllになります。

つまり、C#ではexeとdllは拡張子や役割こそ違いますが、どちらも.NETランタイムが理解できる形式のファイルです。

特に.NET Core、.NET 5、.NET 6以降では、アプリ本体のdllが作成され、それをdotnetコマンドやホスト用exeから起動する構成になることもあります。そのため、C#では「exeだけが実行対象」「dllは絶対に実行できない」と単純に考えるのではなく、プロジェクトの種類や実行方式によって扱いが変わると理解しておくとよいでしょう。

2. C#でexeファイルが作られる仕組み

C#でexeファイルを作るには、実行可能なアプリケーションプロジェクトを作成します。代表的なのは、コンソールアプリやWindowsアプリです。

2-1. コンソールアプリ・Windowsアプリでexeが作成される

C#でexeが作成される代表的なプロジェクトには、次のようなものがあります。

  • コンソールアプリ

  • Windows Formsアプリ

  • WPFアプリ

  • Worker Service

  • デスクトップ向けツール

コンソールアプリは、黒い画面で文字を入力・表示するシンプルなアプリです。C#初心者が最初に学ぶことが多く、exeとdllの違いを理解する練習にも向いています。

Windows FormsやWPFは、ボタンやテキストボックスなどの画面を持つWindowsアプリを作るためのプロジェクトです。これらもユーザーが直接起動するアプリなので、exeとして作成されます。

2-2. Program.csとMainメソッドの役割

C#のexeには、プログラムの開始地点が必要です。その開始地点になるのがMainメソッドです。

従来のC#では、次のようにProgram.csにMainメソッドを書きます。

C#
using System;

namespace SampleExe
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, C# exe!");
}
}
}

このMainメソッドが、exeを起動したときに最初に実行されます。

最近のC#では、トップレベルステートメントという書き方も使えます。

C#
Console.WriteLine("Hello, C# exe!");

このようにMainメソッドを明示的に書かなくても、内部的にはMainメソッドに相当する処理として扱われます。

つまり、C#のexeには「どこから処理を始めるか」という入口が必要です。この入口があることが、exeとdllの大きな違いのひとつです。

2-3. Visual Studioでexeをビルドする手順

Visual StudioでC#のexeを作成する基本的な手順は次のとおりです。

  1. Visual Studioを起動する

  2. 「新しいプロジェクトの作成」を選択する

  3. 「コンソール アプリ」や「Windows Forms アプリ」を選ぶ

  4. プロジェクト名を入力する

  5. 作成されたProgram.csにコードを書く

  6. メニューから「ビルド」→「ソリューションのビルド」を選択する

  7. 出力フォルダにexeが作成される

ビルドが成功すると、通常は次のようなフォルダにexeが出力されます。

bin\Debug\net8.0\
bin\Release\net8.0\

ターゲットフレームワークやビルド構成によって、出力先のフォルダ名は変わります。

2-4. dotnet CLIでexeを作成する方法

Visual Studioを使わなくても、dotnet CLIでC#のexeを作成できます。

まず、コンソールアプリを作成します。

Bash
dotnet new console -n SampleExe

作成したフォルダに移動します。

Bash
cd SampleExe

ビルドします。

Bash
dotnet build

実行します。

Bash
dotnet run

Releaseビルドで作成する場合は、次のようにします。

Bash
dotnet build -c Release

発行用のファイルを作成する場合は、publishコマンドを使います。

Bash
dotnet publish -c Release

.NET 6以降のプロジェクトでは、出力フォルダにexeとdllの両方が生成されることがあります。exeはアプリを起動するためのホストで、dllにはアプリ本体のコードが含まれます。

2-5. DebugビルドとReleaseビルドの違い

C#でexeやdllをビルドするときには、DebugビルドとReleaseビルドがあります。

Debugビルドは、開発中にデバッグしやすいように作られる構成です。ブレークポイントを使って処理を止めたり、変数の中身を確認したりしやすくなっています。

Releaseビルドは、実際に配布・運用することを想定した構成です。最適化が有効になり、Debugビルドより実行効率がよくなることがあります。

ビルド構成主な用途特徴
Debug開発・確認用デバッグしやすい
Release配布・本番用最適化される

初心者のうちは、開発中はDebug、配布や本番利用ではReleaseと覚えておくとよいでしょう。

3. C#でdllファイルが作られる仕組み

C#でdllを作るには、クラスライブラリプロジェクトを作成します。クラスライブラリは、他のプログラムから参照されることを前提にしたプロジェクトです。

3-1. クラスライブラリプロジェクトとは

クラスライブラリプロジェクトとは、共通処理や機能をまとめるためのプロジェクトです。

クラスライブラリ自体は、通常ユーザーが直接起動するものではありません。exeプロジェクトや別のdllプロジェクトから参照されて使われます。

たとえば、次のようなプロジェクト構成が考えられます。

SampleSolution
├─ SampleApp ← exeを作るコンソールアプリ
└─ SampleLibrary ← dllを作るクラスライブラリ

SampleAppからSampleLibraryを参照すると、SampleLibrary内のクラスやメソッドをSampleAppで使えるようになります。

3-2. dllに含めるクラス・メソッドの作り方

dllに含めるクラスやメソッドは、通常のC#コードと同じように作成できます。

たとえば、計算処理を行うクラスをdllに含める場合は、次のように書きます。

C#
namespace SampleLibrary
{
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
}

重要なのは、他のプロジェクトから使いたいクラスやメソッドにpublicを付けることです。

publicが付いていないクラスやメソッドは、基本的に外部のプロジェクトから呼び出せません。

C#
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}

このようにpublicにすることで、exe側からCalculatorクラスを使えるようになります。

3-3. Visual Studioでdllを作成する手順

Visual Studioでdllを作成する基本手順は次のとおりです。

  1. Visual Studioを起動する

  2. 「新しいプロジェクトの作成」を選択する

  3. 「クラス ライブラリ」を選ぶ

  4. プロジェクト名を入力する

  5. クラスやメソッドを作成する

  6. 「ビルド」→「ソリューションのビルド」を選択する

  7. 出力フォルダにdllが作成される

出力先は、通常次のような場所です。

bin\Debug\net8.0\SampleLibrary.dll
bin\Release\net8.0\SampleLibrary.dll

このdllを別のC#プロジェクトから参照すると、dll内のクラスやメソッドを利用できます。

3-4. dotnet CLIでdllを作成する方法

dotnet CLIでクラスライブラリを作成する場合は、次のコマンドを使います。

Bash
dotnet new classlib -n SampleLibrary

作成したフォルダに移動します。

Bash
cd SampleLibrary

ビルドします。

Bash
dotnet build

ビルドが成功すると、出力フォルダにdllが作成されます。

bin\Debug\net8.0\SampleLibrary.dll

Releaseビルドにしたい場合は、次のようにします。

Bash
dotnet build -c Release

3-5. dllの出力先とファイル構成

C#のdllをビルドすると、dll本体だけでなく、関連ファイルが出力されることがあります。

代表的なファイルは次のとおりです。

ファイル役割
.dllライブラリ本体
.pdbデバッグ情報
.deps.json依存関係情報
.xmlXMLドキュメントコメント
.runtimeconfig.json実行時設定

クラスライブラリでは、主にdllファイルが重要です。ただし、デバッグ時にはpdbファイルがあるとエラー箇所の特定がしやすくなります。

他のプロジェクトへdllを渡す場合は、dll単体で足りる場合もありますが、依存するdllがある場合はそれらも一緒に配布する必要があります。

4. C#のexeからdllを参照して使う方法

C#では、exeプロジェクトからdllを参照することで、dll内のクラスやメソッドを使えます。

参照方法には、大きく分けて「プロジェクト参照」と「dllファイル参照」があります。

4-1. プロジェクト参照でdllを追加する方法

同じソリューション内にexeプロジェクトとdllプロジェクトがある場合は、プロジェクト参照を使うのが一般的です。

Visual Studioでプロジェクト参照を追加する手順は次のとおりです。

  1. exe側のプロジェクトを右クリックする

  2. 「追加」→「プロジェクト参照」を選択する

  3. 参照したいクラスライブラリプロジェクトにチェックを入れる

  4. OKを押す

プロジェクト参照を使うと、dll側のコードを変更したときに、exe側でも自動的に最新の状態でビルドされます。

開発中のプロジェクト同士を連携させる場合は、dllファイルを直接参照するよりも、プロジェクト参照のほうが扱いやすいです。

dotnet CLIでは、次のように参照を追加できます。

Bash
dotnet add SampleApp reference SampleLibrary

または、プロジェクトファイルを指定して追加します。

Bash
dotnet add SampleApp/SampleApp.csproj reference SampleLibrary/SampleLibrary.csproj

4-2. 既存のdllファイルを参照に追加する方法

すでに作成済みのdllファイルを参照することもできます。

Visual Studioでは、次の手順で追加します。

  1. exe側プロジェクトの「依存関係」または「参照」を右クリックする

  2. 「参照の追加」を選択する

  3. 「参照」ボタンからdllファイルを選ぶ

  4. OKを押す

ただし、dllファイルを直接参照する場合は注意が必要です。

dllの場所が変わったり、バージョンが変わったりすると、参照エラーが発生することがあります。また、dllが別のdllに依存している場合は、その依存dllも実行フォルダに必要です。

開発中の自作dllであればプロジェクト参照、外部から提供されたdllであればファイル参照、と使い分けるとよいでしょう。

4-3. usingを使ってdll内のクラスを呼び出す方法

dllを参照に追加しただけでは、コード内でクラスをすぐに使えない場合があります。

dll内のクラスが名前空間に属している場合、exe側でusingを追加します。

たとえば、dll側に次のクラスがあるとします。

C#
namespace SampleLibrary
{
public class MessageService
{
public string GetMessage()
{
return "dllから呼び出されたメッセージです";
}
}
}

exe側では、次のようにusingを追加して使います。

C#
using SampleLibrary;

var service = new MessageService();
Console.WriteLine(service.GetMessage());

usingは「この名前空間にあるクラスを使います」という意味です。参照追加とusingの両方がそろうことで、dll内のクラスをスムーズに呼び出せます。

4-4. dllを参照したサンプルコード

dll側のコードは次のとおりです。

C#
namespace MyLibrary
{
public class GreetingService
{
public string CreateGreeting(string name)
{
return $"こんにちは、{name}さん";
}
}
}

exe側のコードは次のとおりです。

C#
using MyLibrary;

var service = new GreetingService();
string message = service.CreateGreeting("太郎");

Console.WriteLine(message);

実行結果は次のようになります。

こんにちは、太郎さん

このように、dll側に共通処理を作成し、exe側から呼び出すことで、処理を分けて管理できます。

4-5. NuGetパッケージとdll参照の違い

C#で外部ライブラリを使う方法には、dll参照のほかにNuGetパッケージがあります。

NuGetは、.NET向けのパッケージ管理の仕組みです。ライブラリ本体だけでなく、依存関係やバージョン管理もまとめて扱えます。

項目dll参照NuGetパッケージ
追加方法dllファイルを直接参照パッケージとして追加
依存関係管理手動になりやすい自動管理されやすい
バージョン管理手間がかかる管理しやすい
用途自作dll、社内dllなど公開ライブラリ、共通パッケージなど

外部ライブラリを使う場合は、可能であればNuGetパッケージを使うほうが管理しやすいです。一方で、社内で作成した独自dllや、特定のベンダーから提供されたdllを使う場合は、dll参照を使うことがあります。

5. C#のexeとdllの実行方法の違い

exeとdllは、実行方法にも違いがあります。基本的にexeは直接実行できますが、dllは他のプログラムから呼び出されることが前提です。

5-1. exeを直接実行する方法

exeは、次のような方法で直接実行できます。

  • エクスプローラーでダブルクリックする

  • コマンドプロンプトから実行する

  • PowerShellから実行する

  • バッチファイルから実行する

  • タスクスケジューラから実行する

コマンドプロンプトで実行する場合は、次のようにします。

Bash
SampleApp.exe

PowerShellの場合は、カレントフォルダにあるexeを次のように実行します。

PowerShell
.\SampleApp.exe

C#で作ったコンソールアプリの場合、実行するとMainメソッドから処理が開始されます。

5-2. dllは単体で実行できるのか

通常のクラスライブラリdllは、単体では実行できません。

なぜなら、dllにはアプリケーションの開始地点となるMainメソッドがないからです。dllはあくまで、exeや他のdllから呼び出される部品です。

たとえば、次のようなクラスライブラリdllをダブルクリックしても、アプリケーションとしては起動しません。

SampleLibrary.dll

このdllを使うには、exe側から参照してクラスやメソッドを呼び出す必要があります。

ただし、.NET Coreや.NET 5以降では、アプリケーション本体がdllとして出力され、dotnetコマンドで実行するケースがあります。

5-3. dotnetコマンドでdllを実行するケース

.NET Coreや.NET 5以降では、次のようにdllをdotnetコマンドで実行することがあります。

Bash
dotnet SampleApp.dll

これは、通常のクラスライブラリdllを実行しているわけではありません。アプリケーションとして作られたdllを、dotnetコマンド経由で実行している状態です。

たとえば、コンソールアプリをビルドすると、次のようなファイルが出力されることがあります。

SampleApp.exe
SampleApp.dll
SampleApp.deps.json
SampleApp.runtimeconfig.json

この場合、SampleApp.dllにはアプリ本体の処理が含まれており、dotnet SampleApp.dllで実行できます。

一方、クラスライブラリとして作成したSampleLibrary.dllは、基本的にdotnetコマンドで直接実行するものではありません。

5-4. .NET Frameworkと.NET 6以降での実行方法の違い

.NET Frameworkと.NET 6以降では、exeやdllの実行・配布方法に違いがあります。

.NET Frameworkでは、Windows上で動くexeを作成するのが一般的でした。実行環境には.NET Frameworkがインストールされている必要があります。

.NET 6以降では、クロスプラットフォーム対応が進み、WindowsだけでなくLinuxやmacOSでも動かせます。また、自己完結型の配布を使えば、実行環境に.NETランタイムがインストールされていなくても動かせる形で配布できます。

項目.NET Framework.NET 6以降
主な対象WindowsWindows、Linux、macOS
実行形式exe中心exe、dll、dotnet実行など
配布方法.NET Framework前提フレームワーク依存、自己完結型など
クロスプラットフォーム基本的に弱い対応しやすい

初心者の場合は、現在のC#開発では.NET 6以降の考え方を押さえておくとよいでしょう。

5-5. 実行時にdllが見つからない場合の原因

exeを実行したときに、必要なdllが見つからないとエラーになることがあります。

主な原因は次のとおりです。

  • dllが実行フォルダにコピーされていない

  • 参照しているdllのパスが間違っている

  • dllのバージョンが違う

  • dllが依存している別のdllが不足している

  • x86とx64の設定が合っていない

  • .NETの対象バージョンが合っていない

C#のexeを配布するときは、exeだけでなく、必要なdllや設定ファイルも一緒に配布する必要があります。

特に、外部dllを使っている場合は、ビルド出力フォルダに必要なファイルがそろっているか確認しましょう。

6. exeとdllを使い分ける判断基準

C#で開発するとき、すべてをexeに書くべきか、処理をdllに分けるべきか迷うことがあります。

ここでは、exeとdllを使い分ける判断基準を解説します。

6-1. アプリとして動かしたい場合はexe

ユーザーが直接起動するアプリケーションとして作りたい場合は、exeを作成します。

たとえば、次のようなものはexeに向いています。

  • コンソールツール

  • デスクトップアプリ

  • バッチ処理アプリ

  • データ変換ツール

  • 管理画面アプリ

  • 業務アプリ

「このプログラム自体を起動したい」と考えるものは、基本的にexeとして作成します。

6-2. 共通処理を再利用したい場合はdll

複数の場所で使う共通処理は、dllにまとめると便利です。

たとえば、次のような処理です。

  • 入力チェック

  • 日付変換

  • 金額計算

  • ログ出力

  • メール送信

  • ファイル読み書き

  • API呼び出し

  • データベースアクセス

同じ処理を複数のexeにコピーして書くと、修正が必要になったときにすべての場所を直さなければなりません。

dllにまとめておけば、共通処理を一か所で管理しやすくなります。

6-3. 複数プロジェクトで同じ処理を使う場合

複数のプロジェクトで同じ処理を使う場合は、dll化を検討するとよいでしょう。

たとえば、次のような構成です。

SalesApp.exe
InventoryApp.exe
ReportApp.exe
CommonLibrary.dll

この場合、販売管理、在庫管理、帳票出力の各アプリが、CommonLibrary.dllを参照します。

共通処理をdllにまとめることで、同じコードを何度も書かずに済みます。また、修正箇所を集約できるため、保守性も高くなります。

6-4. 保守性・再利用性を高めるdll化のメリット

dll化には、次のようなメリットがあります。

  • 共通処理を再利用しやすい

  • コードの重複を減らせる

  • 機能ごとに分けて管理できる

  • テストしやすくなる

  • 大きなアプリを整理しやすい

  • 複数人で開発しやすい

特に、業務システムのように処理が多いアプリでは、すべてをひとつのexeプロジェクトに書くとコードが複雑になります。

機能ごとにdllへ分けることで、責務が明確になり、変更にも強い構成を作りやすくなります。

6-5. 何でもdll化すべきではない理由

dllは便利ですが、何でもdll化すればよいわけではありません。

小さなアプリで処理が少ない場合、無理にdllを分けると、かえって管理が複雑になることがあります。

たとえば、次のようなデメリットがあります。

  • プロジェクト数が増える

  • 参照関係が複雑になる

  • ビルドや配布の管理が増える

  • dllのバージョン管理が必要になる

  • 初心者には構成がわかりにくくなる

dll化するかどうかは、「再利用する必要があるか」「責務を分ける意味があるか」「保守しやすくなるか」で判断しましょう。

単純な学習用アプリや小規模ツールであれば、最初はexeだけで作っても問題ありません。

7. C#のexe・dllでよくあるエラーと対処法

C#でexeやdllを扱っていると、参照エラーや実行時エラーに遭遇することがあります。

ここでは、初心者がつまずきやすいエラーと対処法を紹介します。

7-1. 「参照が見つかりません」と表示される場合

「参照が見つかりません」と表示される場合、exe側がdllを正しく参照できていない可能性があります。

主な原因は次のとおりです。

  • dllファイルの場所が変わった

  • 参照先のプロジェクトが削除された

  • csprojの参照設定が壊れている

  • 対象フレームワークが合っていない

  • NuGetパッケージの復元ができていない

対処法としては、まず参照設定を確認します。

Visual Studioでは、依存関係や参照の項目を確認し、警告マークが出ていないか見ます。壊れている参照があれば削除して、再度追加します。

NuGetパッケージが原因の場合は、次のコマンドで復元します。

Bash
dotnet restore

プロジェクト参照の場合は、参照先のプロジェクトがソリューション内に存在しているか確認しましょう。

7-2. 「Mainメソッドが見つかりません」と表示される場合

「Mainメソッドが見つかりません」というエラーは、実行可能なexeを作ろうとしているのに、プログラムの開始地点が見つからない場合に発生します。

主な原因は次のとおりです。

  • クラスライブラリとして作るべきなのにコンソールアプリ設定になっている

  • Mainメソッドを削除してしまった

  • Mainメソッドの定義が正しくない

  • プロジェクトの出力の種類が間違っている

コンソールアプリなら、次のようなMainメソッドが必要です。

C#
static void Main(string[] args)
{
Console.WriteLine("Hello");
}

または、トップレベルステートメントで次のように書きます。

C#
Console.WriteLine("Hello");

一方、dllを作りたい場合は、プロジェクトの種類をクラスライブラリにする必要があります。

csprojで確認する場合は、OutputTypeがExeになっているか、Libraryになっているかを見ます。

XML
<OutputType>Exe</OutputType>

exeを作る場合はExe、dllを作る場合はLibraryです。

7-3. dllのバージョン違いでエラーになる場合

dllのバージョン違いによって、実行時にエラーが発生することがあります。

たとえば、開発時にはVersion 1.0のdllを参照していたのに、実行環境にはVersion 2.0のdllが置かれているようなケースです。

この場合、次のような問題が起こります。

  • メソッドが見つからない

  • クラスが見つからない

  • 引数の数が合わない

  • 期待した動作と違う

  • 依存関係の読み込みに失敗する

対処法は、参照しているdllと実行フォルダに配置されているdllのバージョンをそろえることです。

NuGetパッケージを使っている場合は、プロジェクト間で同じバージョンを参照しているか確認しましょう。

7-4. 実行時に必要なdllがコピーされない場合

ビルドは成功しているのに、実行するとdllが見つからない場合があります。

この場合、必要なdllが出力フォルダにコピーされていない可能性があります。

確認すべきポイントは次のとおりです。

  • 参照プロパティの「ローカルにコピー」が有効か

  • dllがビルド出力フォルダに存在するか

  • 依存している別のdllもコピーされているか

  • publish時に必要なファイルが含まれているか

  • csprojの設定が正しいか

外部dllをプロジェクトに含める場合は、必要に応じてcsprojにコピー設定を追加します。

XML
<ItemGroup>
<None Include="libs\SampleLibrary.dll" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>

ただし、通常のプロジェクト参照やNuGet参照であれば、自動的に必要なdllがコピーされることが多いです。

7-5. x86・x64の違いによる実行エラー

C#のexeやdllでは、x86とx64の違いが原因でエラーになることがあります。

x86は32ビット、x64は64ビットを意味します。

特に、ネイティブdllを参照している場合や、外部ライブラリが特定のCPUアーキテクチャに依存している場合は注意が必要です。

よくある原因は次のとおりです。

  • exeはx64なのに、参照dllがx86

  • exeはx86なのに、参照dllがx64

  • Any CPUでビルドしているが、実行環境と合わない

  • ネイティブdllの配置場所が間違っている

対処法としては、プロジェクトのプラットフォームターゲットを確認します。

Visual Studioでは、プロジェクトのプロパティから「ビルド」設定を開き、Platform targetを確認します。

一般的には、すべてのプロジェクトでx64に統一する、または必要に応じてx86に統一するとトラブルを避けやすくなります。

8. C#のexeとdllを作成・参照する実践サンプル

ここでは、実際にC#でdllを作成し、exeから呼び出す簡単なサンプルを紹介します。

構成は次のとおりです。

ExeDllSample
├─ MyApp
└─ MyLibrary

MyAppがexeを作るコンソールアプリ、MyLibraryがdllを作るクラスライブラリです。

8-1. dll側のクラスライブラリを作成する

まず、クラスライブラリを作成します。

Bash
dotnet new classlib -n MyLibrary

MyLibraryに、次のようなクラスを作成します。

C#
namespace MyLibrary
{
public class TaxCalculator
{
public decimal AddTax(decimal price, decimal taxRate)
{
return price * (1 + taxRate);
}
}
}

このTaxCalculatorクラスは、税抜価格と税率を受け取り、税込価格を返します。

他のプロジェクトから呼び出すため、クラスとメソッドにはpublicを付けています。

8-2. exe側のコンソールアプリを作成する

次に、コンソールアプリを作成します。

Bash
dotnet new console -n MyApp

作成後、MyAppからMyLibraryを参照します。

Bash
dotnet add MyApp/MyApp.csproj reference MyLibrary/MyLibrary.csproj

これで、MyAppからMyLibrary内のクラスを使えるようになります。

8-3. exeからdllのメソッドを呼び出す

MyApp側のProgram.csを次のように書きます。

C#
using MyLibrary;

var calculator = new TaxCalculator();

decimal price = 1000m;
decimal taxRate = 0.1m;

decimal result = calculator.AddTax(price, taxRate);

Console.WriteLine($"税抜価格: {price}円");
Console.WriteLine($"税込価格: {result}円");

using MyLibrary;を追加することで、dll側にあるTaxCalculatorクラスを呼び出せます。

このコードでは、MyApp.exeが起動し、MyLibrary.dll内のAddTaxメソッドを使って税込価格を計算します。

8-4. ビルドして実行結果を確認する

ソリューション全体をビルドする場合は、次のようにします。

Bash
dotnet build

MyAppを実行します。

Bash
dotnet run --project MyApp

実行結果は次のようになります。

税抜価格: 1000円
税込価格: 1100.0円

この結果から、exe側のコンソールアプリが、dll側の計算処理を呼び出していることがわかります。

8-5. サンプル構成から理解するexeとdllの関係

今回のサンプルでは、MyAppがexe、MyLibraryがdllです。

役割を整理すると、次のようになります。

プロジェクト生成物役割
MyAppMyApp.exeアプリとして起動する
MyLibraryMyLibrary.dll計算処理を提供する

MyApp.exeは、ユーザーが実行するアプリです。

一方、MyLibrary.dllは単体では実行せず、MyApp.exeから呼び出されます。

このように、C#ではexeを「実行する本体」、dllを「再利用できる部品」として分けることで、わかりやすく保守しやすい構成を作れます。

9. C#のexeとdllに関するよくある質問

最後に、C#のexeとdllに関して初心者が疑問に感じやすい点をQ&A形式で解説します。

9-1. C#のdllは他の言語から使える?

C#のdllは、条件によっては他の言語から使えます。

同じ.NET系の言語であるVB.NETやF#からは、比較的簡単に参照できます。C#で作ったクラスライブラリをVB.NETから呼び出すことも可能です。

一方、C++やPythonなど.NET以外の言語から使う場合は、追加の仕組みが必要になることがあります。

たとえば、COMとして公開したり、C++/CLIを使ったり、API化したりする方法があります。

初心者の場合は、まずC#のexeからC#のdllを参照する方法を理解するのがおすすめです。

9-2. dllをexeに変換できる?

通常のクラスライブラリdllを、そのままexeに変換することはできません。

exeとして実行するには、Mainメソッドのような開始地点が必要です。dllには通常その開始地点がないため、単体のアプリとしては動きません。

ただし、dll内の処理を呼び出すexeプロジェクトを別に作れば、結果的にそのdllの機能を実行するアプリを作れます。

つまり、「dllを直接exeに変換する」というより、「dllを利用するexeを作る」と考えるのが自然です。

9-3. exeの中にdllを含めて配布できる?

.NETでは、発行方法によってはexeやdll、ランタイムなどをまとめて配布できます。

たとえば、自己完結型の発行を使うと、実行に必要なランタイムを含めて配布できます。また、単一ファイル発行を使うと、複数のファイルをひとつの実行ファイルにまとめることもできます。

dotnet CLIでは、次のようなpublishコマンドを使います。

Bash
dotnet publish -c Release

単一ファイルで発行する場合は、設定を追加します。

Bash
dotnet publish -c Release -p:PublishSingleFile=true

ただし、すべてのdllが完全にひとつのexeに埋め込まれるとは限らず、ネイティブdllや設定ファイルが別に出力される場合もあります。

配布前には、実行環境で正しく動作するか確認しましょう。

9-4. dllの中身は見られる?

C#で作成したdllの中身は、専用のツールを使うとある程度確認できる場合があります。

.NETのdllにはメタデータや中間言語が含まれているため、逆コンパイルツールを使うと、クラス名やメソッド名、処理内容が見えることがあります。

そのため、dllに重要な機密情報を直接書き込むのは避けるべきです。

たとえば、次のような情報をコード内に直接書くのは危険です。

  • パスワード

  • APIキー

  • 秘密鍵

  • 接続文字列

  • ライセンス情報

必要に応じて、設定ファイル、環境変数、シークレット管理などを使いましょう。

また、難読化ツールを使うことでコードを読みにくくすることはできますが、完全に見られなくするものではありません。

9-5. 初心者はexeとdllのどちらから学ぶべき?

初心者は、まずexeから学ぶのがおすすめです。

理由は、exeのほうが実行結果を確認しやすいからです。コンソールアプリを作って実行し、画面に結果を表示する流れを理解すると、C#の基本が身につきやすくなります。

その後、処理が増えてきたらdllを学ぶとよいでしょう。

おすすめの学習順序は次のとおりです。

  1. コンソールアプリでexeを作る

  2. MainメソッドやProgram.csを理解する

  3. クラスとメソッドを作る

  4. クラスライブラリでdllを作る

  5. exeからdllを参照する

  6. 共通処理をdllに分ける

この順番で学ぶと、exeとdllの役割の違いを自然に理解できます。

まとめ

C#のexeとdllは、どちらも.NETアセンブリとして扱われますが、役割が異なります。

exeは、ユーザーやOSから起動される実行ファイルです。コンソールアプリやWindowsアプリなど、アプリケーションとして動かしたいものはexeとして作成します。

一方、dllは、他のプログラムから呼び出して使うライブラリファイルです。共通処理や業務ロジック、便利な機能をまとめて、複数のプロジェクトで再利用するために使います。

C#でexeを作成するには、コンソールアプリやWindowsアプリを作成します。C#でdllを作成するには、クラスライブラリプロジェクトを作成します。

exeからdllを使うには、プロジェクト参照やdllファイル参照を追加し、必要に応じてusingを使ってdll内のクラスを呼び出します。

初心者は、まずexeでアプリを作る流れを理解し、その後でdllを使った共通処理の分離や再利用を学ぶのがおすすめです。

C#のexeとdllの違いを理解できると、プロジェクト構成を整理しやすくなり、保守性や再利用性の高いアプリケーションを作れるようになります。