C# プロジェクト間アクセスの基礎

この資料では、C#でプロジェクト間のクラスアクセスを行う方法と、アクセス修飾子 internal および public の使い方について説明します。また、ビルド後に生成されるDLLファイルやフォルダー構成についても触れます。具体例を用いて、プロジェクト間でクラスを共有する方法を解説します。

前提条件

  • Visual Studio を使用
  • C# プログラミングの基礎知識
  • 2つのプロジェクト(クラスライブラリとコンソールアプリ)が必要

手順

ステップ 1: クラスライブラリプロジェクトの作成

まず、クラスを定義するためのクラスライブラリプロジェクトを作成します。

  1. Visual Studio で、ClassLibrary1という名前の新しいクラスライブラリプロジェクトを作成します。
  2. クラスライブラリプロジェクトに次のようなクラスを追加します。

MyClass.cs (ClassLibrary1)

namespace ClassLibrary1
{
    // internal クラスは同じプロジェクト内でのみアクセス可能
    internal class InternalClass
    {
        public string GetMessage()
        {
            return "これは internal クラスです!";
        }
    }

    // public クラスは他のプロジェクトからアクセス可能
    public class PublicClass
    {
        public string GetMessage()
        {
            return "これは public クラスです!";
        }
    }
}
  • InternalClass: これは internal 修飾子を持っており、同じプロジェクト(アセンブリ)内でのみアクセス可能です。
  • PublicClass: これは public 修飾子を持っており、他のプロジェクトからもアクセス可能です。

ステップ 2: コンソールアプリプロジェクトの作成

次に、ConsoleApp1という名前の新しいコンソールアプリケーションプロジェクトを作成します。

  1. Visual Studioで、ConsoleApp1という名前の新しいコンソールアプリケーションプロジェクトを作成します。
  2. 次に、ClassLibrary1 プロジェクトを ConsoleApp1 から参照する必要があります。

参照の追加方法

  1. ConsoleApp1 プロジェクトを右クリックして、[参照の追加] を選択します。
  2. ダイアログボックスが開いたら、[プロジェクト] タブを選択します。
  3. ClassLibrary1 を選択し、[OK] をクリックして参照を追加します。

これにより、ConsoleApp1プロジェクトからClassLibrary1のクラスにアクセスできるようになります。

ステップ 3: コンソールアプリでクラスを利用

次に、ConsoleApp1Program.csに以下のコードを記述して、ClassLibrary1からクラスにアクセスします。

Program.cs (ConsoleApp1)

using System;
using ClassLibrary1;  // ClassLibrary1の参照が必要

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // PublicClassはpublicなのでアクセス可能
            PublicClass publicClass = new PublicClass();
            Console.WriteLine(publicClass.GetMessage());

            // InternalClassはアクセスできない(コメントアウトしてある部分がエラーになります)
            // InternalClass internalClass = new InternalClass(); // エラー: InternalClassにアクセスできない

            Console.ReadLine();
        }
    }
}

結果

コンソールに次のメッセージが表示されます。

これは public クラスです!

一方、InternalClass にアクセスしようとすると、コンパイルエラーが発生します。これは、internal 修飾子によってクラスのアクセスがプロジェクト内に制限されているためです。

アクセス修飾子の違い

public

  • 外部プロジェクトからアクセス可能: public 修飾子がついているクラスやメンバーは、同じアセンブリ内だけでなく、他のプロジェクトからもアクセス可能です。
  • 例: PublicClass は他のプロジェクトから使用できます。

internal

  • 同じプロジェクト内でのみアクセス可能: internal 修飾子は、そのクラスやメンバーを同じプロジェクト(アセンブリ)内でのみアクセス可能に制限します。他のプロジェクトからはアクセスできません。
  • 例: InternalClass はクラスライブラリプロジェクト内でのみ使用可能です。

ビルド後のDLLの生成

DLLとは?

クラスライブラリをビルドすると、bin フォルダーに DLL(Dynamic Link Library) ファイルが生成されます。このファイルには、クラスライブラリ内のクラスやメソッドが含まれており、他のプロジェクトからその機能を利用することができます。

フォルダー構成(ビルド後)

ビルド後、各プロジェクトにbin フォルダーが生成され、その中にDLLや実行ファイル(EXE)が格納されます。

フォルダー構成例

/MySolution
│
├── /ClassLibrary1
│   ├── /bin
│   │   └── /Debug
│   │       └── net6.0
│   │           └── ClassLibrary1.dll   <-- クラスライブラリのDLL
│   ├── /obj
│   ├── ClassLibrary1.csproj
│   └── MyClass.cs
│
└── /ConsoleApp1
    ├── /bin
    │   └── /Debug
    │       └── net6.0
    │           └── ConsoleApp1.exe     <-- コンソールアプリのEXE
    │           └── ClassLibrary1.dll   <-- クラスライブラリのDLLがコピーされる
    ├── /obj
    ├── ConsoleApp1.csproj
    └── Program.cs

各ファイルの役割

  • ClassLibrary1.dll: クラスライブラリのビルド後に生成されるDLLファイルです。このファイルには、ClassLibrary1内で定義されたクラスやメソッド(PublicClassInternalClass)が含まれています。このDLLファイルを他のプロジェクトから参照することで、クラスライブラリ内のコードを使用することができます。
  • ConsoleApp1.exe: コンソールアプリケーションのビルド後に生成される実行可能ファイル(EXE)です。このファイルは、アプリケーションのエントリーポイントを持っており、Mainメソッドから実行が開始されます。
  • ConsoleApp1フォルダーの中のClassLibrary1.dll: コンソールアプリケーションがクラスライブラリを参照しているため、ビルド時にクラスライブラリのDLLがコピーされます。これにより、コンソールアプリはクラスライブラリ内のクラスやメソッドにアクセスできるようになります。

まとめ

  • プロジェクト間でクラスを共有する場合は、public 修飾子を使用する必要があります。
  • internal 修飾子は、クラスやメンバーを同じプロジェクト内に限定するのに役立ちます。
  • クラスライブラリをビルドするとDLLファイルが生成され、他のプロジェクトで再利用可能になります。
  • DLLを利用して、プロジェクト間のクラスやメソッドを効率的に共有できます。
  • プロジェクト間のクラスアクセスを行う際には、参照の追加が必要です。Visual Studioで簡単に追加できます。

この資料を使用して、プロジェクト間でのクラスアクセスとDLLの使用方法を理解し、実際にプロジェクトで動作確認を行うことができます。

C#

Posted by hidepon