ここでは.NET(.NET Core/.NET Framework)におけるクラスライブラリについてと、その作り方について解説します。

以下の解説では、クラスライブラリをコマンドラインツールで作成する方法IDEで作成する方法について触れています。 Visual Studioを使った場合およびMonoDevelop (Visual Studio for Mac)を使った場合のそれぞれについて解説しています。 また、プロジェクトファイルをコマンドラインツールやIDEによらずテキストエディタで作成してクラスライブラリを構成する方法についても触れています。


以下の解説ではクラスライブラリを作成する言語と使用する言語に同一の言語を使用する例のみを扱います。 .NETでは、例えばC#で書かれたクラスライブラリをVB.NETで使用する、あるいはその逆など、クラスライブラリとそれを呼び出して使うコードにそれぞれ異なる言語を選択することができますが、ここでは解説のために言語を統一しています。 異なる言語間で使用する場合、その際に注意するべき点、言語間の相互運用性については言語間の相互運用性と共通言語仕様 (CLS)で解説しています。

C#/VB.NETでは、コード中にXMLドキュメントコメントを記載することにより、クラスライブラリの生成と同時にドキュメント(APIリファレンス)を生成することができます。 それらの方法については、XMLドキュメントコメントを用いたドキュメントの作成で解説しています。 必要に応じて参照してください。

ここで紹介するクラスライブラリは、命名規約などクラスライブラリのデザインに関するガイドラインに従うようにしていますが、その詳細については触れません。 詳しくはMSDNのクラス ライブラリ開発のデザイン ガイドラインを参照してください。

名前空間やクラスの基本など、クラスライブラリを作成する上で把握しておくべき言語の要素については解説しないので、必要に応じて以下のページなどを参照してください。

.NETにおけるライブラリ

クラスライブラリの作り方に入る前に、まずは.NETにおけるクラスライブラリの位置づけと関連する概念について簡単に見ていきます。

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

アセンブリには、コンパイルされた実行可能なコード(型やメソッド)の他、メタデータリソースが含められます。 このうちメタデータは、アセンブリが外部に公開する型の情報や、アセンブリ自身が依存する他のアセンブリについての参照情報などが含まれています。 これにより、アセンブリ(クラスライブラリ)を参照してコードをビルド・実行する際に、アセンブリのメタデータから必要な情報を取得することができます。 言い換えると、ヘッダーファイルのようなクラスライブラリのAPI情報を記載した外部ファイルは必要とされず、かわりにアセンブリ自体から取得することになります。

.NET Frameworkのみが存在していた時代では*.dllファイルだけで必要な情報が取得できましたが、.NET Coreがリリースされている現在ではランタイムの種類とフレームワークバージョンの組み合わせを含めた依存関係を解決する必要があり、それを補助するために*.runtimeconfig.json*.deps.jsonといった外部ファイルも必要になっています。

実行可能なコードとメタデータのほかに、アセンブリにはリソースを含めることもできます。 例えば、実行可能なコードとは別に、テキスト・画像・音声・映像・その他のファイルなど、任意のデータをリソースとして埋め込み、それらを実行時に使用することできます。 アセンブリへのリソースの埋め込みと読み込みについてはリソースの埋め込みと読み込みで解説しているので、そちらを参照してください。


ライブラリアセンブリは、拡張子が.dllとなっていることからもわかるように、静的にリンクされるものではなく実行時に必要に応じて読み込まれます。

ビルド時にプロジェクトの参照で追加されているライブラリアセンブリは、そのコードが実行されるまでに読み込まれます。 プロジェクトの参照に追加されていないライブラリアセンブリの場合でも、Assembly.Loadメソッドなどを用いることにより実行時に任意のアセンブリを読み込み、そのアセンブリに含まれる型やメソッドを呼び出すことができます。

これにより、例えばアプリケーションにプラグイン機構を持たせたい場合は、プラグインを個別のライブラリアセンブリとして構成し、実行時にそれを読み込ませることにより実現することができます。


.NETのクラスライブラリ(アセンブリ)は、C#やVB.NETなど任意の.NET言語で記述・使用することができます。 アセンブリの実行可能コードは、記述言語に関わらず共通中間言語(CIL, Common Intermediate Language)としてコンパイルされ、格納されます。

これにより、例えばC#で記述したライブラリアセンブリを参照してVB.NETで使用するといったことが可能です。 クラスライブラリを異なる言語からでも使用できるようにする場合に考慮すべき事項や注意点などについては言語間の相互運用性と共通言語仕様 (CLS)で解説しています。


アセンブリについてより詳しくは、以下のドキュメントを参照してください。

クラスライブラリ(ライブラリアセンブリ)の作成

ここからはクラスライブラリの作り方について見ていきます。 ここでは、コマンドラインを使った場合と、IDEを使った場合の二つの方法でのクラスライブラリの作り方について紹介します。 また、 コマンドやIDEがどのようなことを行っているか、プロジェクトファイルの内容がどうなっているか理解するためにテキストエディタでプロジェクトファイルを作成する方法も紹介しています。

なお、この文章では、最終的に次のような構成・内容のクラスライブラリを作成することを目的とします。

作成するサンプル用クラスライブラリ

アセンブリ名
Smdn.Utils (Smdn.Utils.dll)
ルート名前空間
Smdn.Utils
アセンブリに含める型
以下の2つのクラスを含める
StringUtilsクラス
文字列操作に関する以下のユーティリティメソッドを提供する
Reverseメソッド
引数で指定された文字列の並びを逆転した文字列を返すメソッド
SplitBySpaceメソッド
引数で指定された文字列を全角および半角の空白で区切った配列で返すメソッド
OrderByLengthComparerクラス
Comparer<string>を継承し、文字列の長さに従って並べ替えるようにオーバーライドしたクラス

ソースコード

ここで作成するクラスライブラリでは、一つのソースファイルに一つのクラスを含めるようにします。 個々のソースファイルに記述する内容は、以下の内容を使うことにします。

StringUtils.cs
using System;

namespace Smdn.Utils {
  public static class StringUtils {
    public static string Reverse(string str)
    {
      if (str == null) throw new ArgumentNullException(nameof(str));

      var chars = str.ToCharArray();

      Array.Reverse(chars);

      return new string(chars);
    }

    public static string[] SplitBySpace(string str)
    {
      if (str == null) throw new ArgumentNullException(nameof(str));

      return str.Split(new char[] {' ', ' '}, StringSplitOptions.None);
    }
  }
}
OrderByLengthComparer.cs
using System;
using System.Collections.Generic;

namespace Smdn.Utils {
  public class OrderByLengthComparer : Comparer<string> {
    public override int Compare(string x, string y)
    {
      return x.Length - y.Length;
    }
  }
}
StringUtils.vb
Imports System

Namespace Smdn.Utils
  Public Module StringUtils
    Public Function Reverse(ByVal str As String) As String
      If str Is Nothing Then Throw New ArgumentNullException("str")

      Dim chars() As Char = str.ToCharArray()

      Array.Reverse(chars)

      Return New String(chars)
    End Function

    Public Function SplitBySpace(ByVal str As String) As String()
      If str Is Nothing Then Throw New ArgumentNullException("str")

      Return str.Split(New Char() {" "c, " "c}, StringSplitOptions.None)
    End Function
  End Module
End Namespace
OrderByLengthComparer.vb
Imports System
Imports System.Collections.Generic

Namespace Smdn.Utils
  Public Class OrderByLengthComparer
    Inherits Comparer(Of String)

    Public Overrides Function Compare(ByVal x As String, ByVal y As String) As Integer
      Return x.Length - y.Length
    End Function
  End Class
End Namespace

動作確認用のコード

クラスライブラリを作成した後、動作確認をするために以下のコードを使います。

test.cs; 作成したクラスライブラリの動作確認用コード
using System;
using Smdn.Utils;

class Sample {
  static void Main()
  {
    string s1 = "The quick brown fox jumps over the lazy dog";
    string s2 = "かごめかごめ かごのなかのとりは いついつでやる";

    // StringUtils.Reverseメソッドのテスト
    Console.WriteLine("[StringUtils.Reverse]");
    Console.WriteLine(StringUtils.Reverse(s1));
    Console.WriteLine(StringUtils.Reverse(s2));

    // StringUtils.SplitBySpaceメソッドのテスト
    string[] w1 = StringUtils.SplitBySpace(s1);
    string[] w2 = StringUtils.SplitBySpace(s2);

    Console.WriteLine("[StringUtils.SplitBySpace]");

    Print(w1);
    Print(w2);

    // OrderByLengthComparerクラスのテスト
    Console.WriteLine("[OrderByLengthComparer]");

    OrderByLengthComparer comparer = new OrderByLengthComparer();

    Array.Sort(w1, comparer);
    Array.Sort(w2, comparer);

    Print(w1);
    Print(w2);
  }

  static void Print(string[] words)
  {
    foreach (string word in words) {
      Console.WriteLine(word);
    }
  }
}
test.vb; 作成したクラスライブラリの動作確認用コード
Imports System
Imports Smdn.Utils

Class Sample
  Shared Sub Main()
    Dim s1 As String = "The quick brown fox jumps over the lazy dog"
    Dim s2 As String = "かごめかごめ かごのなかのとりは いついつでやる"

    ' StringUtils.Reverseメソッドのテスト
    Console.WriteLine("[StringUtils.Reverse]")
    Console.WriteLine(StringUtils.Reverse(s1))
    Console.WriteLine(StringUtils.Reverse(s2))

    ' StringUtils.SplitBySpaceメソッドのテスト
    Dim w1() As String = StringUtils.SplitBySpace(s1)
    Dim w2() As String = StringUtils.SplitBySpace(s2)

    Console.WriteLine("[StringUtils.SplitBySpace]")

    Print(w1)
    Print(w2)

    ' OrderByLengthComparerクラスのテスト
    Console.WriteLine("[OrderByLengthComparer]")

    Dim comparer As New OrderByLengthComparer()

    Array.Sort(w1, comparer)
    Array.Sort(w2, comparer)

    Print(w1)
    Print(w2)
  End Sub

  Shared Sub Print(ByVal words() As String)
    For Each word As String In words
      Console.WriteLine(word)
    Next
  End Sub
End Class

このコードを実行した場合に期待される出力結果は次のとおりです。

実行結果
[StringUtils.Reverse]
god yzal eht revo spmuj xof nworb kciuq ehT
るやでついつい はりとのかなのごか めごかめごか
[StringUtils.SplitBySpace]
The
quick
brown
fox
jumps
over
the
lazy
dog
かごめかごめ
かごのなかのとりは
いついつでやる
[OrderByLengthComparer]
the
fox
The
dog
over
lazy
quick
brown
jumps
かごめかごめ
いついつでやる
かごのなかのとりは

コマンドラインでの作成手順

ここではクラスライブラリの作成と使用に必要最低限の手順を理解するためにコマンドラインでのビルド手順を解説します。 コマンドラインでの操作に興味がない場合は、IDEを使ったビルド手順まで読み飛ばしてください。

dotnetコマンドを使う場合

.NET Core SDKに含まれるdotnetコマンドを使ってクラスライブラリを作成する手順を見ていきます。 dotnetコマンドでは、プロジェクトの作成・ビルド・実行やプロジェクトへの参照の追加ができるようになっているため、コードの記述以外の操作はすべてこのコマンドで行えます。

dotnetコマンドで作成されるプロジェクトファイルを編集することで、ビルド時の設定などを細かく変更することができますが、ここではその具体的方法については触れません。 詳しくはプロジェクトファイルを参照してください。

クラスライブラリプロジェクトの作成 (dotnet new)

まずは、dotnet newコマンドでクラスライブラリのテンプレートを使ってプロジェクトを作成します。

クラスライブラリプロジェクトの作成
# C#プロジェクトを作成する場合
dotnet new classlib --language "c#" --name Smdn.Utils

# VB.NETプロジェクトを作成する場合
dotnet new classlib --language vb --name Smdn.Utils

--nameオプションで指定した名前でディレクトリとプロジェクトファイルが作成されます。 ここでは次のような構成になっています。 (以下はC#での例ですが、VB.NETでも同様の出力となります)

Smdn.Utils/
├── Class1.cs
├── Smdn.Utils.csproj
└── obj/

テンプレート用のクラスファイル(*.cs/*.vb)も同時に作成されるので、ここにクラスを記述するか、不要なら削除します。

次に、クラスライブラリの内容となるソースコードを記述していきます。 ここではライブラリのソースファイル2つcsproj/vbprojファイルと同じディレクトリに配置します。 最終的には次のようなディレクトリ構成にします。

Smdn.Utils/
├── OrderByLengthComparer.cs
├── Smdn.Utils.csproj
├── StringUtils.cs
└── obj/

クラスライブラリプロジェクトのビルド (dotnet build)

続いて、このプロジェクトをビルドします。 プロジェクトファイル(*.csproj/*.vbproj)と同じディレクトリで、dotnet buildコマンドを実行します。

デフォルトではDebug構成でビルドされるので、Release構成でビルドしたい場合はオプション-c Releaseを指定してビルドします。 現在のディレクトリに複数プロジェクトファイルがある場合や、異なるディレクトリにあるプロジェクトファイルをビルドしたい場合は、そのプロジェクトのパスを指定します。

クラスライブラリプロジェクトのビルド
# 現在のディレクトリにあるプロジェクトファイルをビルドする (Debug構成でビルドされる)
dotnet build

# 現在のディレクトリにあるプロジェクトファイルを、Release構成でビルドする
dotnet build -c Release

# プロジェクトファイルのパスを指定してビルドする場合
dotnet build Smdn.Utils.csproj

ビルドが完了すると、bin/Debug(またはbin/Release)以下のディレクトリにライブラリアセンブリ(*.dllファイル)が出力されます。

Smdn.Utils/
├── OrderByLengthComparer.cs
├── Smdn.Utils.csproj
├── StringUtils.cs
├── bin/
│   └── Debug/
│       └── netstandard2.0/
│           ├── Smdn.Utils.deps.json
│           ├── Smdn.Utils.dll
│           └── Smdn.Utils.pdb
└── obj/

クラスライブラリを使用するプロジェクトの作成・実行

ここからは、作成したクラスライブラリプロジェクトを参照し、クラスライブラリを使用する手順を見ていきます。

まず、クラスライブラリを使用するプロジェクトとして、ここではコンソールアプリケーションのプロジェクトを作成します。 クラスライブラリプロジェクトの場合と同様に、dotnet newコマンドでプロジェクトを作成します。 ここではコンソールアプリケーションのプロジェクトを作成するため、classlibのかわりにconsoleを指定します。 またここでは、プロジェクト名をSampleとしています。

サンプルプロジェクトの作成
# C#プロジェクトを作成する場合
dotnet new console --language "c#" --name Sample

# VB.NETプロジェクトを作成する場合
dotnet new console --language vb --name Sample

クラスライブラリプロジェクトの場合と同様、--nameオプションで指定した名前でディレクトリとプロジェクトファイルが作成されます。

ここでは、クラスライブラリプロジェクトと同じディレクトリにコンソールプロジェクトを作成したものと仮定し、構成は次のようになっているものとします。

Sample/
├── Program.cs
├── Sample.csproj
└── obj/
Smdn.Utils/
├── OrderByLengthComparer.cs
├── Smdn.Utils.csproj
├── StringUtils.cs
└── obj/

続いて、作成したコンソールプロジェクトに、先に作成しておいたクラスライブラリプロジェクトの参照を追加します。 ここではSample.csprojにSmdn.Utils.csprojへの参照を追加したいため、dotnet addコマンドを使って次のように参照を追加します。

サンプルプロジェクトの作成
dotnet add Sample\Sample.csproj reference Smdn.Utils\Smdn.Utils.csproj

これにより、Sample.csprojから、Smdn.Utils.csprojにあるクラスを参照することができるようになります。

ここでは一つのクラスライブラリを追加しましたが、複数のクラスライブラリを参照するような場合は同じ手順を繰り返して参照を追加していくことになります。


次に、クラスライブラリのテスト用のコードを記述していきます。 ここでは動作確認用のコードをファイルProgram.csとして記述します。 コードの記述が終わったらビルド・実行します。 ビルドはクラスライブラリプロジェクトのビルドと同様に、dotnet buildコマンドを実行します。

コンソールプロジェクトなどの実行可能なプロジェクトの場合は、dotnet runコマンドでビルドと生成した実行可能ファイルの実行を同時に行うことができます。

実行可能プロジェクトのビルドと実行
# 現在のディレクトリにあるプロジェクトファイルをビルド・実行する
dotnet run

# プロジェクトファイルのパスを指定してビルド・実行する場合
dotnet run Sample\Sample.csproj

これでクラスライブラリを使用したプロジェクトのビルド・実行ができるようになりました。 dotnet runコマンドで正しくビルドできた場合は、次のように実行結果が出力されます。

実行結果
[StringUtils.Reverse]
god yzal eht revo spmuj xof nworb kciuq ehT
るやでついつい はりとのかなのごか めごかめごか
[StringUtils.SplitBySpace]
The
quick
brown
fox
  :
  :
(以下省略)

ここではクラスライブラリを参照する実行可能ファイルを作成しましたが、あるクラスライブラリを参照する別のクラスライブラリを作成するような場合も、同じような手順で作成していくことになります。

生成されるファイルとディレクトリ構成

ここまでの手順で生成されるファイルとディレクトリ構成は次のようになっています。 中間ファイルが格納されているobjディレクトリの内容は省略しています。

動作確認用のプロジェクトのbinディレクトリには、ビルドで生成されたクラスライブラリのアセンブリ(Smdn.Utils.dll)と、動作確認用のプロジェクトから生成される実行可能ファイル(Sample, Windows上でビルドした場合はSample.exeとなる)が出力されています。

出力されるファイルとディレクトリ構成
./Sample/
├── Program.cs
├── Sample.csproj
├── bin
│   └── Debug
│       └── netcoreapp3.1
│           ├── Sample
│           ├── Sample.deps.json
│           ├── Sample.dll
│           ├── Sample.pdb
│           ├── Sample.runtimeconfig.dev.json
│           ├── Sample.runtimeconfig.json
│           ├── Smdn.Utils.dll
│           └── Smdn.Utils.pdb
└── obj
./Smdn.Utils/
├── OrderByLengthComparer.cs
├── Smdn.Utils.csproj
├── StringUtils.cs
├── bin
│   └── Debug
│       └── netstandard2.0
│           ├── Smdn.Utils.deps.json
│           ├── Smdn.Utils.dll
│           └── Smdn.Utils.pdb
└── obj

コマンドラインコンパイラを使う場合

ここではコマンドラインコンパイラ(C#コンパイラcscまたはVB.NETコンパイラvbc)を使ってクラスライブラリを作成する手順を見ていきます。 プロジェクトファイルを使用せず、ソースファイルのみからコンパイル・ビルドしたい場合はこれらのコンパイラを直接使います。

クラスライブラリのコンパイル (/target:library)

クラスライブラリをコンパイルする上で最低限必要なコンパイルオプションは以下のとおりです。

/target:library
出力するアセンブリの種類をライブラリアセンブリにします。
/out:出力ファイル名
コンパイルした結果の出力ファイル名を指定します。
ここではSmdn.Utils.dllを出力ファイル名に設定します。
ソースファイル
ライブラリアセンブリのソースコードとなるファイルを指定します。 ソースファイルが複数ある場合は、それらすべてを指定します。
ここではライブラリのソースファイル2つを指定します。

vbcでは、必要に応じて/optionstrict+/optionexplicit+などのオプションも指定します。


実際にコンパイルするためのコマンドラインはそれぞれ次のようになります。

クラスライブラリをコンパイルする
# csc(C#)の場合
csc /target:library /out:Smdn.Utils.dll StringUtils.cs OrderByLengthComparer.cs

# vbc(VB.NET)の場合
vbc /optionstrict+ /optionexplicit+ /target:library /out:Smdn.Utils.dll StringUtils.vb OrderByLengthComparer.vb

コンパイルが完了すると、ライブラリアセンブリSmdn.Utils.dllが作成されます。

cscおよびvbcを使用する場合は、環境変数PATHに適切なパスが設定されている必要があります。

Roslyn(MSBuild)がインストールされている環境(またはRoslynのcsc/vbcを使用する場合)では、次のコマンドでパスを通してください。

環境変数PATHの設定・Roslynのcsc/vbc向け
set PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\Roslyn;%PATH%

.NET Framework 4.xのみがインストールされている環境(または.NET Framework 4.xのcsc/vbcを使用する場合)では、次のコマンドでパスを通してください。

環境変数PATHの設定・.NET Framework 4.xのcsc/vbc向け
set PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%PATH%

クラスライブラリを使用するコードのコンパイル (/r:*.dll)

ここまでの手順で作成したクラスライブラリを使って実行可能ファイルを作り、動作テストをしてみます。 ライブラリアセンブリを使って実行可能ファイルをコンパイルする上で最低限必要なコンパイルオプションは次のとおりです。

/r:ライブラリアセンブリのパス
参照するライブラリアセンブリへのパスを指定します。 複数ある場合はその分だけ/rオプションを指定します。
ここでは先に作成したSmdn.Utils.dllを参照するように指定します。
ソースファイル
実行可能ファイルのソースコードとなるファイルを指定します。 ソースファイルが複数ある場合は、それらすべてを指定します。
ここでは動作確認用のコードを指定します。

vbcでは、必要に応じて/optionstrict+/optionexplicit+などのオプションも指定します。


実際にコンパイルするためのコマンドラインはそれぞれ次のようになります。

クラスライブラリを参照してコードをコンパイルする
# csc(C#)の場合
csc /r:Smdn.Utils.dll test.cs

# vbc(VB.NET)の場合
vbc /optionstrict+ /optionexplicit+ /r:Smdn.Utils.dll test.vb

コンパイルが完了すると、実行可能ファイルが作成されます。 出力ファイル名(/outオプション)を指定しない場合はソースファイル名から実行可能ファイル名が決定されます。 この例ではtest.exeが作成されます。

これでクラスライブラリを使用したコードの実行ができるようになりました。 この実行可能ファイルtest.exeを実行すると、次のように実行結果が出力されます。

実行結果
[StringUtils.Reverse]
god yzal eht revo spmuj xof nworb kciuq ehT
るやでついつい はりとのかなのごか めごかめごか
[StringUtils.SplitBySpace]
The
quick
brown
fox
  :
  :
(以下省略)

ここではクラスライブラリを参照する実行可能ファイルを作成しましたが、あるクラスライブラリを参照する別のクラスライブラリを作成するような場合も、同じような手順で作成していくことになります。

IDEでの作成手順と設定

ここではIDEを使ってクラスライブラリを作成する手順と、作成したクラスライブラリを使用する手順について解説します。 ここで紹介する手順では、一つのソリューションにクラスライブラリ用のプロジェクトとテスト用のプロジェクトを含めることにします。 IDEを使わずコマンドラインで作成したい場合や、ビルドだけコマンドラインで実行したいなどの場合は、コマンドラインを使ったビルド手順を参照してください。

Visual Studio 2019での例

クラスライブラリプロジェクトの作成

まずは、クラスライブラリ用のプロジェクトを作成します。 プロジェクト作成ウィザードではソリューションも作成できるので、同時に作成します。

スタートアップ画面の右側にあるアクションから、「新しいプロジェクトの作成」を選択します。

スタートアップ画面から「新しいプロジェクトの作成」を選択する

既に起動している場合は、[ファイル]メニューの[新規作成]→[プロジェクト]を選択します。

次に、プロジェクトの種類を選択します。 検索ボックスに「ライブラリ」と入力するなどして、[クラス ライブラリ]のプロジェクトを選択します。 クラスライブラリのプロジェクトにもいくつか種類がありますが、ここでは.NET Standardのものを選択します。 また言語によっても項目が別れているので、C#またはVBなど、目的の言語のものを選択します。

作成するプロジェクトの種類の選択

プロジェクトの種類を選択したら、プロジェクト名を入力します。 ここではクラスライブラリのプロジェクト名となるSmdn.Utilsを[プロジェクト名]に指定します。 また、ここではソリューション名をclasslibraryとしました。

作成するプロジェクトとソリューションの名前入力

ここまでの手順で、ソリューションとクラスライブラリ用のプロジェクト、ソースファイルのテンプレートが自動生成されます。 テンプレートとして用意されているソースファイル(Class1)はここでは不要なので削除しておくと良いでしょう。


続いて、クラスのコードを記述するためソースファイルを追加します。 プロジェクト(Smdn.Utils)のコンテキストメニューから[追加]→[新しい項目]を選択します。

クラスのコードを記述するソースファイルの新規追加

追加する項目のカテゴリ一覧から[コード]を指定し、[クラス]を選択します。 ファイル名は任意ですが、ここではクラス名+拡張子を指定します。

追加するファイルの種類と名前の設定

上記の手順を繰り返してクラス用のファイルをプロジェクトに追加し、ライブラリのソースファイル2つを記述します。

追加したファイルにコードを記述する

ここまでの手順で、ソースコードをライブラリアセンブリとしてビルドすることができるようになりました。

クラスライブラリを使用するプロジェクトの作成・実行

次に、クラスライブラリを使用する側のプロジェクトを追加します。 クラスライブラリはエントリーポイントを持たず、それ単体では実行することができないので、作成したクラスライブラリを使用して動作確認用のコードを実行するためのプロジェクトを作成します。

まず、ソリューションのコンテキストメニューから[追加]→[新しいプロジェクト]を選択します。

プロジェクトの新規追加

次にプロジェクトの種類を選択します。 実行可能ファイルを生成するプロジェクトを作成する必要があるので、ここでは[コンソール アプリ]を選択します。 クラスライブラリのプロジェクトと同様、コンソールアプリのプロジェクトにもいくつか種類がありますが、ここでは.NET Coreのものを選択します。 また言語によっても項目が別れているので、C#またはVBなど、目的の言語のものを選択します。

作成するプロジェクトの種類の選択

プロジェクトの種類を選択したら、プロジェクト名を入力します。 ここではプロジェクト名をSampleとしました。

作成するプロジェクトの種類の選択

ここまでの手順で、動作確認用のコンソールアプリプロジェクトがソリューションに追加され、ソースファイルのテンプレートが自動生成されます。


続いて、動作確認用のプロジェクトが参照するアセンブリ(プロジェクト)として、先に作成したクラスライブラリを追加します。 プロジェクトの[依存関係]のコンテキストメニューから[参照の追加]を選択します。

プロジェクトに参照を追加する

[プロジェクト]のカテゴリを選択し、クラスライブラリのプロジェクトであるSmdn.Utilsに☑チェックを入れます。

参照するプロジェクトの選択

これで、動作確認用のプロジェクトがクラスライブラリのプロジェクトを参照するようになります。

追加されたプロジェクトの参照

ここまでの手順で、クラスライブラリのクラス・メソッドを参照することができるようになったため、入力候補にもクラスライブラリのクラス・メソッドが現れるようになります。

入力候補に表示されるクラスライブラリの名前空間
入力候補に表示されるクラスライブラリのクラスとメソッド

あとは動作確認用のコードを記述していきます。


コードを記述したら、そのコードを実行してみます。 その前にまずは、動作確認用のプロジェクトの設定を変更しておきます。 プロジェクトのコンテキストメニューから[スタートアップ プロジェクトに設定]を選択します。

プロジェクトをスタートアッププロジェクトに設定する

これでプロジェクトを実行する準備が整いました。 動作確認用のプロジェクトが選択されていることを確認して、▶実行ボタンを押すと、プロジェクトがビルドされ、実行されます。

プロジェクトをビルド・実行する

ビルドが問題なく完了し、実行ができるとコンソールウィンドウが表示され、次のような結果が得られるはずです。

動作確認用コードの実行結果

生成されるファイルとディレクトリ構成

ここまでの手順で生成されるファイルとディレクトリ構成は次のようになっています。 中間ファイルが格納されているobjディレクトリの内容は省略しています。

動作確認用のプロジェクトのbinディレクトリには、ビルドで生成されたクラスライブラリのアセンブリ(Smdn.Utils.dll)と、動作確認用のプロジェクトから生成される実行可能ファイル(Sample.exe)が出力されています。

出力されるファイルとディレクトリ構成
C:.
└─classlibrary
    │  classlibrary.sln
    │
    ├─Sample
    │  │  Program.cs
    │  │  Sample.csproj
    │  │
    │  ├─bin
    │  │  └─Debug
    │  │      └─netcoreapp3.1
    │  │              Sample.deps.json
    │  │              Sample.dll
    │  │              Sample.exe
    │  │              Sample.pdb
    │  │              Sample.runtimeconfig.dev.json
    │  │              Sample.runtimeconfig.json
    │  │              Smdn.Utils.dll
    │  │              Smdn.Utils.pdb
    │  │
    │  └─obj
    │
    └─Smdn.Utils
        │  OrderByLengthComparer.cs
        │  Smdn.Utils.csproj
        │  StringUitls.cs
        │
        ├─bin
        │  └─Debug
        │      └─netstandard2.0
        │              Smdn.Utils.deps.json
        │              Smdn.Utils.dll
        │              Smdn.Utils.pdb
        │
        └─obj

MonoDevelop 7.8での例

ここではMonoDevelopを使った場合について解説しますが、UIの差異はあるもののVisual Studio for Macでも概ね同様の手順が適用できると思われます。

クラスライブラリプロジェクトの作成

まずは、クラスライブラリ用のプロジェクトを作成します。 プロジェクト作成ウィザードではソリューションも作成できるので、同時に作成します。

[ファイル]メニューから[新しいソリューション]を選択します。

新しいソリューションの作成

次に、プロジェクトの種類を選択します。 [.NET Core]カテゴリの下にある[ライブラリ]を選択し、[.NET Standard ライブラリ]のプロジェクトを選択します。 また、ここで言語の選択もできるので、C#またはVBなど、目的の言語のものを選択します。

作成するプロジェクトの種類の選択

続いて、ターゲットフレームワークを選択します。 クラスライブラリがサポートする予定の範囲に合わせて適当なフレームワークを選択する必要がありますが、ここでは.NET Standard 2.0を選択します。

ターゲットフレームワークの選択

プロジェクト名を入力します。 ここではクラスライブラリのプロジェクト名となるSmdn.Utilsを[プロジェクト名]に指定します。 また、ここではソリューション名をclasslibraryとしました。

作成するプロジェクトとソリューションの名前入力

ここまでの手順で、ソリューションとクラスライブラリ用のプロジェクト、ソースファイルのテンプレートが自動生成されます。 テンプレートとして用意されているソースファイル(Class1)はここでは不要なので削除しておくと良いでしょう。


続いて、クラスのコードを記述するためソースファイルを追加します。 プロジェクト(Smdn.Utils)のコンテキストメニューから[追加]→[新しいファイル]を選択します。

クラスのコードを記述するソースファイルの新規追加

追加する項目のカテゴリ一覧から[General]を指定し、[空のクラス]を選択します。 名前にはクラス名を入力します。 ファイル名は自動的にクラス名.拡張子として決定されます。

追加するファイルの種類と名前の設定

上記の手順を繰り返してクラス用のファイルをプロジェクトに追加し、ライブラリのソースファイル2つを記述します。

追加したファイルにコードを記述する

ここまでの手順で、ソースコードをライブラリアセンブリとしてビルドすることができるようになりました。

クラスライブラリを使用するプロジェクトの作成・実行

次に、クラスライブラリを使用する側のプロジェクトを追加します。 クラスライブラリはエントリーポイントを持たず、それ単体では実行することができないので、作成したクラスライブラリを使用して動作確認用のコードを実行するためのプロジェクトを作成します。

まず、ソリューションのコンテキストメニューから[追加]→[新しいプロジェクトを追加]を選択します。

プロジェクトの新規追加

次にプロジェクトの種類を選択します。 実行可能ファイルを生成するプロジェクトを作成する必要があるので、ここでは[.NET Core]カテゴリの下にある[アプリ]を選択し、[コンソール アプリケーション]のプロジェクトを選択します。 また言語によっても項目が別れているので、C#またはVBなど、目的の言語のものを選択します。

作成するプロジェクトの種類の選択

続いて、ターゲットフレームワークを選択します。 クラスライブラリがサポートしている範囲に合わせて適当なフレームワークを選択する必要がありますが、ここでは.NET Core 2.1を選択します。

ターゲットフレームワークの選択

プロジェクトの種類を選択したら、プロジェクト名を入力します。 ここではプロジェクト名をSampleとしました。

作成するプロジェクトの種類の選択

ここまでの手順で、動作確認用のコンソールアプリプロジェクトがソリューションに追加され、ソースファイルのテンプレートが自動生成されます。


続いて、動作確認用のプロジェクトが参照するアセンブリ(プロジェクト)として、先に作成したクラスライブラリを追加します。 プロジェクトの[依存関係]のコンテキストメニューから[参照の編集]を選択します。

プロジェクトの参照を編集する

[プロジェクト]のタブを選択し、クラスライブラリのプロジェクトであるSmdn.Utilsに☑チェックを入れます。

参照するプロジェクトの選択

これで、動作確認用のプロジェクトがクラスライブラリのプロジェクトを参照するようになります。

追加されたプロジェクトの参照

ここまでの手順で、クラスライブラリのクラス・メソッドを参照することができるようになったため、入力候補にもクラスライブラリのクラス・メソッドが現れるようになります。

入力候補に表示されるクラスライブラリの名前空間
入力候補に表示されるクラスライブラリのクラスとメソッド

あとは動作確認用のコードを記述していきます。


コードを記述したら、そのコードを実行してみます。 その前にまずは、動作確認用のプロジェクトの設定を変更しておきます。 プロジェクトのコンテキストメニューから[スタートアップ プロジェクトとして設定]を選択します。

プロジェクトをスタートアッププロジェクトに設定する

これでプロジェクトを実行する準備が整いました。 ▶実行ボタンを押すと、プロジェクトがビルドされ、実行されます。

プロジェクトをビルド・実行する

ビルドが問題なく完了し、実行ができるとコンソールウィンドウが表示され、次のような結果が得られるはずです。

動作確認用コードの実行結果

生成されるファイルとディレクトリ構成

ここまでの手順で生成されるファイルとディレクトリ構成は次のようになっています。 中間ファイルが格納されているobjディレクトリの内容は省略しています。

動作確認用のプロジェクトのbinディレクトリには、ビルドで生成されたクラスライブラリのアセンブリ(Smdn.Utils.dll)と、動作確認用のプロジェクトから生成される実行可能ファイル(Sample.exe)が出力されています。

出力されるファイルとディレクトリ構成
classlibrary/
├── Sample
│   ├── Program.cs
│   ├── Sample.csproj
│   ├── bin
│   │   └── Debug
│   │       └── netcoreapp2.1
│   │           ├── Sample.deps.json
│   │           ├── Sample.dll
│   │           ├── Sample.pdb
│   │           ├── Sample.runtimeconfig.dev.json
│   │           ├── Sample.runtimeconfig.json
│   │           ├── Smdn.Utils.dll
│   │           └── Smdn.Utils.pdb
│   └── obj
├── Smdn.Utils
│   ├── OrderByLengthComparer.cs
│   ├── Smdn.Utils.csproj
│   ├── StringUtils.cs
│   ├── bin
│   │   └── Debug
│   │       └── netstandard2.0
│   │           ├── Smdn.Utils.deps.json
│   │           ├── Smdn.Utils.dll
│   │           └── Smdn.Utils.pdb
│   └── obj
└── classlibrary.sln

テキストエディタでの作成手順

ここではビルドのみをdotnetコマンドで行い、プロジェクトファイルとソースコードはテキストエディタを使って直接作成・編集する場合を取り上げます。

このセクションは、IDEがない環境やテキストエディタとコマンドラインのみでプロジェクトを扱いたい場合、dotnetコマンドによるプロジェクトファイルの操作が実際にどのようなことを行っているか理解したい場合、最小構成のプロジェクトについて理解したい場合を想定しています。 プロジェクトファイルそのものの詳細についてはプロジェクトファイルを適宜参照してください。

クラスライブラリプロジェクトの作成とビルド

まずはクラスライブラリとなるプロジェクトファイルを作成します。 C#の場合は拡張子.csproj、VBの場合は.vbprojでファイルを作成します。 ここではクラスライブラリ名に合わせて、ファイル名もSmdn.Utilsに設定します。 ファイルに記述する内容は次のとおりです。

クラスライブラリのプロジェクトファイル
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

ターゲットフレームワーク(TargetFramework)は、クラスライブラリがサポートする予定の範囲に合わせて適当なフレームワークを選択する必要がありますが、ここでは.NET Standard 2.0(netstandard2.0)を指定します。

続いて、ソースコードを作成・配置します。 ここではライブラリのソースファイル2つをプロジェクトファイルと同じディレクトリ階層に配置します。

クラスライブラリのディレクトリ構成
Smdn.Utils/
├── OrderByLengthComparer.cs
├── Smdn.Utils.csproj
└── StringUtils.cs

プロジェクトファイルがあるディレクトリとそのサブディレクトリにあるソースファイルは、自動的にビルド対象として含められます。

ここまでの手順でビルドに必要なファイルは揃ったので、ビルドします。 ビルドするにはdotnet buildコマンドを使います。 デフォルトではカレントディレクトリにあるプロジェクトファイルがビルド対象になりますが、プロジェクトファイルを明示的に指定してビルドすることもできます。

プロジェクトのビルド
# 現在のディレクトリにあるプロジェクトファイルをビルドする
dotnet build

# プロジェクトファイルのパスを指定してビルドする場合
dotnet build Smdn.Utils.csproj

クラスライブラリを使用するプロジェクトの作成・実行

続いて、クラスライブラリを参照して動作確認を行うためのプロジェクトを作成します。 クラスライブラリの場合と同様、実行可能ファイルを生成するプロジェクトファイルを作成します。 ここではファイル名はSampleとします。 拡張子は言語に合わせて.csproj/.vbproj等から選んでください。 ファイルに記述する内容は次のとおりです。

動作確認用の実行可能なプロジェクトファイル
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\Smdn.Utils\Smdn.Utils.csproj" />
  </ItemGroup>
</Project>

プロジェクトは実行可能ファイルを生成する必要があるため、出力形式(OutputType)にExeを指定します。

ターゲットフレームワーク(TargetFramework)は、クラスライブラリがサポートしている範囲に合わせて適当なフレームワークを選択する必要がありますが、ここでは.NET Core 3.1(netcoreapp3.1)を指定します。

また、クラスライブラリのプロジェクトファイルを参照するため、ItemGroup要素下にProjectReference要素を置き、Include属性でそのプロジェクトファイルへのパスを指定します。 ここでは、それぞれのプロジェクトの配置が次のようなディレクトリ構成になっているものと仮定します。

クラスライブラリと動作確認用プロジェクトの配置とディレクトリ構成
Sample/
└── Sample.csproj
Smdn.Utils/
└── Smdn.Utils.csproj

複数のクラスライブラリプロジェクトを参照する場合は、その分だけProjectReference要素とInclude属性を用意し、プロジェクトファイルへのパスを指定します。


続いて、ソースコードを作成・配置します。 ここでは動作確認用のコードをプロジェクトファイルと同じディレクトリ階層に配置します。

動作確認用プロジェクトのディレクトリ構成
Sample/
├── Program.cs
└── Sample.csproj

ここまでの手順でクラスライブラリと、それを使用する動作確認用のコードをビルド・実行する準備が整いました。 あとはdotnet buildコマンドでビルドする、dotnet runコマンドでビルド・実行します。

プロジェクトの実行
# 現在のディレクトリにあるプロジェクトファイルを実行する
dotnet run

# プロジェクトファイルのパスを指定して実行する場合
dotnet run Sample.csproj

クラスライブラリの設計・構成の例

当サイトでは以下のページにて.NET Framework向けのライブラリを公開・配布しています。

ソースも同梱しているので、クラスライブラリの設計・構成の参考になるかもしれません。 よろしければご覧ください。

クラスライブラリの機能の廃止

クラスライブラリで提供している機能を非推奨としたり、廃止したりする際、Obsolete属性を用いると、その旨をライブラリを使ったコードのコンパイル時に利用者に対して通知することができます。 Obsolete属性について詳しくは機能の廃止・非推奨化で解説しています。 また、クラスライブラリで提供している機能を廃止する際の方法や考慮すべき点などについては機能の廃止・非推奨化 §.公開されたAPIの廃止とObsolete属性で解説しています。

クラスライブラリと言語

ここまでの手順ではクラスライブラリと実行可能ファイルの両方に同じ言語を使って記述してきましたが、別々の言語で記述して使用することも出来ます。 クラスライブラリが異なる言語からも使用されることを想定する場合には、言語間の相互運用性について留意しておく必要があります。 この点については次のページで詳しく解説します。