C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のSystem.Reflection名前空間とは?アセンブリ情報の取得と動的読み込みを解説

System.Reflection名前空間の概要

C#におけるSystem.Reflection名前空間には、メタデータを調査することで、アセンブリ、モジュール、メンバー、パラメーターなど、コード内の各要素に関する情報を提供する型が含まれています。この名前空間に属するAssemblyクラスはアセンブリそのものを表し、通常はTypeオブジェクトのAssemblyプロパティを通じてアクセスできます。

リフレクションを活用すると、実行時に型の構造を動的に調べたり、属性情報を取得したり、遅延バインディング(Late Binding)によるオブジェクト生成などを行うことが可能になります。

アセンブリの識別情報を構成する4つの要素

アセンブリの識別情報(Identity)は、次の4つの項目によって構成されます。

  • 簡易名(Simple Name):アセンブリの基本となる名前
  • バージョン:AssemblyVersion属性による major.minor.build.revision 形式(属性が指定されていない場合は 0.0.0.0)
  • カルチャ(Culture):サテライトアセンブリでない場合は「neutral」
  • 公開キートークン(Public Key Token):厳密な名前(Strong Name)を持たない場合は null

完全修飾アセンブリ名の形式

より詳細な完全修飾アセンブリ名は文字列として表現され、上記の識別項目が以下の形式で含まれます。

simple-name, Version=version, Culture=culture, PublicKeyToken=public-key

コード例

実際にAssemblyオブジェクトから完全修飾名を取得する例を見てみましょう。

Assembly assembly = typeof(Person).Assembly; // Personはクラス名
// 出力例: c-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Console.WriteLine(assembly.FullName);

このように、FullNameプロパティを参照するだけで、アセンブリのバージョンやカルチャ、公開キートークンの状態をひと目で確認できます。

アセンブリの読み込みと解決(Assembly Resolution)

アセンブリの読み込み(Assembly Loading)とは、既知の場所からアセンブリを読み込む処理のことです。通常、CLR(共通言語ランタイム)はアセンブリの完全な名前を使用して読み込みを行います。この一連のプロセスはアセンブリ解決(Assembly Resolution)と呼ばれます。

アセンブリ解決が実行されるのは、主に次のようなケースです。

  • CLRが依存関係(参照されている別のアセンブリ)を解決する必要がある場合
  • プログラマーがAssembly.Load(assemblyName)メソッドを使って、アセンブリを動的に読み込みたい場合

動的なアセンブリ読み込みは、プラグイン機構の実装や、実行時まで判断できないモジュールの利用など、柔軟なアプリケーション設計において重要なテクニックとなります。

  1. ソフトウェアとは?基本の仕組みから種類・入手方法まで徹底解説

    ソフトウェアとは、広い意味で言えば、あなたとデバイスのハードウェアの間に位置し、そのデバイスを使えるようにするための一連の命令(一般に「コード」と呼ばれます)のことです。 コンピュータソフトウェアとは? では、コンピュータソフトウェアとは一体何なのでしょうか。それは、コンピュータの物理的な部品とのやり取りを可能にする、目に見えない存在です。ソフトウェアのおかげで、私たちはスマートフォン、タブレット、ゲーム機、メディアプレーヤーなどのデバイスとコミュニケーションを取ることができます。 ここで重要なのは、ハードウェアとソフトウェアには明確な違いがあるという点です。ソフトウェアは無形のリソースであ

  2. C++で解くミラーリフレクション(鏡面反射)問題のアルゴリズムと実装

    ミラーリフレクション問題とは4つの壁すべてに鏡が張られた正方形の部屋を考えてみましょう。南西の角以外の各角には、0、1、2という番号が付けられたレシーバー(受光器)が設置されています。この正方形の部屋の一辺の長さは p であり、南西の角から発射されたレーザー光線は、最初に東側の壁に当たります。その位置は、0番のレシーバーから距離 q の地点です。このとき、光線が最初に到達するレシーバーの番号を求めるのが本問題です。例えば、p = 2、q = 1 の場合を考えてみます。光線は壁で反射を繰り返し、最終的に左側の壁へ戻ってきたときに初めてレシーバー2に到達します。したがって、出力は 2 となります。