ライブラリの基礎 - C Sharp DLL
概要
ライブラリの読み込み
ライブラリの作成
- Rider
- [新規ソリューション]ボタンを押下する。
- [新規ソリューション]画面が開くので、[.NET / .NET Core]の[クラスライブラリ]、または、[.NET Framework]の[クラスライブラリ]を選択する。
- ソリューション名、プロジェクト名、他の設定項目を入力して、[作成]ボタンを押下する。
- Visual Studio
- [ファイル]メニューバー - [新規作成] - [プロジェクト]を選択する。
- [新しいプロジェクト]画面にて、[クラスライブラリ(.NET Standard)]、または、[クラスライブラリ(.NET Framework)]を選択する。
- ソリューション名を入力して、[OK]ボタンを押下する。
// クラスライブラリ
namespace SampleLibrary
{
public class SampleClass
{
public int SampleMethod(int i, int j) => i + j;
}
}
ライブラリの暗黙的な読み込み
- Rider
- 画面左ペインにある[ソリューション]からプロジェクト名を右クリックして、[追加] - [参照...]を選択する。
- [参照の追加]画面が開くので、[追加(A)...]ボタンを押下して、追加するライブラリファイルを選択する。
- [OK]ボタンを押下する。
- 画面左ペインにある[ソリューション]を展開して、<プロジェクト名> - <依存関係> - <.NET バージョン> - <アセンブリ>内にライブラリファイル名が追加される。
- Visual Studio
- [ソリューションエクスプローラー] - [参照]を右クリックして、コンテキストメニューから[参照の追加]を選択する。
- [参照マネージャー]画面が開くので、[参照]ボタンを押下して、追加するライブラリファイルを選択する。
- [参照マネージャー]画面の[参照]にライブラリファイル名が追加される。
- [OK]ボタンを押下する。
using <ライブラリの名前空間名 例: SampleLibrary>;
// クラスライブラリのオブジェクトを生成
// ただし、Staticクラスの場合は生成は不要
var sampleClass = new <ライブラリのクラス名 例: SampleClass>();
// クラスライブラリのメソッドを実行
// <ライブラリのクラス名>.<メソッド名>(引数 1, 引数 2, ...);
sampleClass.SampleMethod();
ライブラリの明示的な読み込み
ライブラリの明示的な読み込みは、プラグインを設計する場合等に便利である。
// ファイル名を使用する場合
using System;
using System.Reflection;
class Program
{
static void Main()
{
// アセンブリのファイル名を指定してアセンブリを読み込む
// ライブラリ名のみを記述する場合、実行バイナリと同階層のディレクトリにライブラリが存在すること
var assembly = Assembly.LoadFrom("<ライブラリ名 または ライブラリのパス>");
// モジュールを取得する
var module = assembly.GetModule("<ライブラリ名>");
// クラスの完全修飾名(アセンブリ内のクラスの型)を取得
// <名前空間名>.<クラス名>
// 上記のサンプルライブラリの場合 --> var sampleType = assembly.GetType("SampleLibrary.SampleClass");
var sampleType = module.GetType("<名前空間名>.<クラス名>");
if (sampleType != null)
{
// 通常のクラスの場合
// 例: コンストラクタへ引数を渡す場合 --> var instance = Activator.CreateInstance(sampleType, <コンストラクタの引数 1>, <コンストラクタの引数 2>, ...);
// 上記のサンプルライブラリの場合 --> var instance = Activator.CreateInstance(sampleType);
// ただし、Staticクラスの場合は不要
var instance = Activator.CreateInstance(sampleType);
// クラスのメソッド名を取得
// 上記のサンプルライブラリの場合 --> var method = sampleType.GetMethod("SampleMethod");
var method = sampleType.GetMethod("<メソッド名>");
if (method != null)
{
// メソッドに引数がある場合
// 例: 引数がint, stringの2つ存在する場合 --> var args = new object[] { 5, "hoge" };
// 上記のサンプルライブラリの場合 --> var args = new object[] { 10, 20 };
var args = new object[] { <引数1>, <引数2>, ... };
// メソッドを実行
// 例1: メソッドに引数が存在しない場合 --> var result = method.Invoke(instance, null);
// 例2: メソッドに引数と戻り値が存在しない場合 --> method.Invoke(instance, null);
var result = method.Invoke(instance, args);
// Staticクラスの場合、Invokeメソッドの第1引数はnullを指定する
// 例1: メソッドに引数が存在しない場合 --> var result = method.Invoke(null, null);
// 例2: メソッドに引数と戻り値が存在しない場合 --> method.Invoke(null, null);
var result = method.Invoke(null, args);
// 結果を表示する (戻り値がある場合)
Console.WriteLine("Result: " + result);
}
else
{
Console.WriteLine("Method not found.");
}
}
else
{
Console.WriteLine("Class not found.");
}
}
}
// アセンブリ名を使用する場合
using System;
using System.Reflection;
class Program
{
static void Main()
{
// アセンブリのファイル名を指定してアセンブリを読み込む
// ライブラリ名のみを記述する場合、実行バイナリと同階層のディレクトリにライブラリが存在すること
// 上記のサンプルライブラリの場合 --> var assembly = Assembly.Load("SampleLibrary");
var assembly = Assembly.Load("<アセンブリ名>");
// クラスの完全修飾名(アセンブリ内のクラスの型)を取得
// <名前空間名>.<クラス名>
// 上記のサンプルライブラリの場合 --> var sampleType = assembly.GetType("SampleLibrary.SampleClass");
var sampleType = module.GetType("<名前空間名>.<クラス名>");
// クラスのメソッド名を取得
// 上記のサンプルライブラリの場合 --> var method = sampleType.GetMethod("SampleMethod");
var method = sampleType.GetMethod("<メソッド名>");
// 通常のクラスの場合
// 例: コンストラクタへ引数を渡す場合 --> var instance = Activator.CreateInstance(sampleType, <コンストラクタの引数 1>, <コンストラクタの引数 2>, ...);
// 上記のサンプルライブラリの場合 --> var instance = Activator.CreateInstance(sampleType);
// ただし、Staticクラスの場合は不要
var instance = Activator.CreateInstance(sampleType);
// メソッドに引数がある場合
// 例: 引数がint, stringの2つ存在する場合 --> var args = new object[] { 5, "hoge" };
// 上記のサンプルライブラリの場合 --> var args = new object[] { 10, 20 };
var args = new object[] { <引数1>, <引数2>, ... };
// メソッドを実行
// 例1: メソッドに引数が存在しない場合 --> var result = method.Invoke(instance, null);
// 例2: メソッドに引数と戻り値が存在しない場合 --> method.Invoke(instance, null);
var result = method.Invoke(instance, args);
}
}
デバッグ方法
C#ライブラリのデバッグ方法を、以下に記載する。
- Rider
- 外部コードのデバッグは初期状態で有効化されている。
もし、デバッガにライブラリコードを無視させる場合は、以下に示す手順に従う。
- 外部コードのデバッグを無効にするには、[ファイル]メニューバー - [設定] - 設定画面の左ペインにある[ビルド、実行、デプロイ] - [デバッガー]を選択する。
- 設定画面の右ペインにある[外部ソースのデバッグを可能にする]チェックボックスのチェックを外す。
- ただし、このオプションを無効にしても、外部コードに移動してブレークポイントのみを設定することはできる。
- しかし、外部コードのブレークポイントはデバッガによって無視されて、外部コードに入ることはできなくなる。
- 外部コードのデバッグは初期状態で有効化されている。
- Visual Studio
- [ソリューションエクスプローラー]において、C#ライブラリプロジェクトを右クリックして[プロパティ]を選択する。
- [C# デバッグ プロパティ]画面が開くので、画面上部にある[構成]プルダウンから[デバッグ]を選択する。
- 画面左にある[デバッグ]を選択する。
- 画面右にある[開始動作]で次の手順を行う。
- .NET Frameworkの場合、[外部プログラムを起動する]を選択して、呼び出し元の実行ファイルのフルパスを入力する。
- .NET FrameworkでASP.NETの場合、[ブラウザーを開始時に使用するURL]を選択して、ローカルのASP.NETアプリのURLを入力する。
- .NET / .NET Coreの場合、[デバッグプロパティ]ページが異なる。
[起動]プルダウンから[実行可能ファイル]を選択して、[実行可能ファイル]項目に、呼び出し元の実行ファイルのフルパスを入力する。
- コマンドライン引数が必要な場合、[コマンドライン引数]項目または[アプリケーション引数]項目に、必要なコマンドライン引数を入力する。
- [ファイル] - [選択した項目を保存]ボタンを押下して、変更を保存する。(または、[Ctrl] + [S]キーを押下する)
C#ライブラリプロジェクトを右クリックして、[スタートアッププロジェクトに設定]を選択して、デバッグを開始する。
デバッグでブレークポイントがヒットしない場合、自身のDLL出力(初期設定では、<project>\Debugディレクトリ)が、
呼び出し元の実行ファイルで呼び出されている場所であることを確認する。
リモートデバッグ方法
別のPCに配置されているC#プロジェクトをデバッグするには、C#プロジェクトを配置したPCにリモートツールをインストールおよび実行して、
Visual StudioからリモートPCに接続するようにプロジェクトを構成する。
リモートデバッガは、Windows 7以降(Phoneを除く)およびWindows Server 2008 SP2以降でサポートされている。
※注意
プロキシ経由で接続された2台のPC間のデバッグはサポートされていない。
待機時間の長い接続や低帯域幅の接続(ダイヤルアップ等)や国をまたぐインターネット経由のデバッグは推奨されない。
これらは、障害が発生したり、過度に低速になる可能性がある。
まず、リモートツールのダウンロードおよびインストールする。
リモートPCにおいて、以下のリンクから使用しているVisual Studioのバージョン用のリモートツールを選択する。
(リモートPCと同じアーキテクチャを持つリモートツールを選択すること)
例えば、Windows x64を実行しているリモートPCにおいて、x86のソフトウェアをデバッグする場合、x64のリモートツールをインストールする。
- Visual Studio 2019
- リモートツール
- 全てのバージョンのVisual Studio 2019と互換性がある。
- x86、x64、ARM64に一致するバージョンをダウンロードする。
- Windows Serverの場合、リモートツールのダウンロードについては、ファイルのダウンロードのブロック解除に関するページを参照すること。
- Visual Studio 2017
- リモートツール
- 全てのバージョンのVisual Studio 2017と互換性がある。
- (x86、x64、ARM64に一致するバージョンをダウンロードする。
- Windows Serverの場合、リモートツールのダウンロードについては、ファイルのダウンロードのブロック解除に関するページを参照すること。
- Visual Studio 2015
- リモートツール
- Visual Studio 2015のリモートツールは、My.VisualStudio.com で入手できる。
- Visual Studio Dev Essentialsプログラム(無料)に参加するか、または、Visual StudioサブスクリプションIDでサインインする。
- Windows Serverの場合、リモートツールのダウンロードについては、ファイルのダウンロードのブロック解除に関するページを参照すること。
リモートデバッガの設定方法を、以下に記載する。
- リモートPC上の[スタート]メニューから[リモートデバッガー]を起動する。
- リモートPCに対する管理アクセス許可が無い場合、リモートデバッグを行う実行ファイル等を右クリックして、[管理者として実行]を選択する。
それ以外の場合、通常通り開始する。
また、管理者として実行されているプロセスまたは別のユーザ(IIS等)で実行されているプロセスにアタッチする場合、
リモートデバッグする実行ファイル等を右クリックして、[管理者として実行]を選択する。
詳細については、Visual Studioのドキュメントを参照すること。 - リモートデバッガを構成する前にリモートデバッガを開始すると、[リモート デバッグの構成]画面が開く。
- Windows Web Services APIがインストールされていない場合((Windows Server 2008 R2のみ)、[インストール]ボタンを押下する。
- リモートツールを使用するネットワークの種類を少なくとも1つ選択する。
PCがドメインを介して接続されている場合、最初の項目を選択する必要がある。
PCがワークグループまたはホームグループを介して接続されている場合、必要に応じて、2番目または3番目の項目を選択する。 - [リモート デバッグの構成]を選択して、ファイアウォールを構成して、リモートデバッガを起動する。
- リモートデバッガの構成が完了すると、[リモート デバッガー]画面が開く。
- リモートデバッガは接続を待機するので、表示されているサーバ名とポート番号を使用して、Visual Studioでリモート接続構成を設定する。
- リモートデバッガを停止する方法は、[ファイル] - [終了]を選択する。
リモートデバッガを再起動するには、[スタート]メニューまたはコマンド ラインから以下のコマンドを実行する。<リモートデバッガのインストールディレクトリ>\msvsmon.exe