morishima0524
@morishima0524

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

C#における「モジュール」が指す範囲がわからない

Q&A

解決したいこと

C#において「モジュール」と言ったとき、それは何を示しているのか?
C#における「モジュール」という言葉の意味・範囲を知りたい。
アセンブリ、クラス、ファイルとはどういう関係なのか知りたい。

発生している問題・エラー

[ModuleInitializer]をメソッドにつけると「モジュール」の読み込み時に実行される。
Visual Studioで以下の2ファイルを作成して実行すると、モジュール初期化処理が呼ばれる。

  • ModuleInitializerを含むクラス定義があるファイル(以下のMyClass.cs)
  • そうではないクラス(名前空間も別)定義があるファイル(以下の、Main.cs)
    • Mainメソッドはこっちにある
    • MyClassの処理は呼んでいない

該当するソースコード

MyClass.cs
using System.Runtime.CompilerServices;

namespace ModuleTest2
{
    // モジュールの初期化時に一度だけ呼ばれる

    internal class MyClass2
    {
        [ModuleInitializer]
        public static void Initializer1()
        {
            Console.WriteLine("ModuleInit1");
        }
    }
}
C# Main.cs
using System;

namespace ModuleTest
{
    internal class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("MyMain");
        }
    }
}

自分で試したこと

  • 上記のコードを書いて動かしてみた
    • モジュール初期化処理が動いた
    • ModuleInit1
      MyMain
      
  • 以下のキーワードで検索して記事を読んでみた
    • C# モジュールとは
    • C# ModuleInitializer
  • 以下のコマンドを実行した。
    • csc /t:module Main.cs
    • Main.netmodule ができた
  • 以下のコマンドを実行した(エラーになった)。
    • csc /t:module MyClass.cs
    • error CS0246: 型または名前空間の名前 'ModuleInitializerAttribute' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)
    • error CS0246: 型または名前空間の名前 'ModuleInitializer' が見つかり(ry
    • 解決はしていないが、System.Runtime.CompilerServices を含むアセンブリを指定できていないためと推測。

わかったこと

  • アセンブリに複数の「モジュール」が含まれること
    • .NET と .NET Framework では、1 つまたは複数のソース コード ファイルからアセンブリをビルドできます。 .NET Framework では、アセンブリに 1 つまたは複数のモジュールを含めることができます。

    • https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/
0

1Answer

注釈
モジュールは、1 つ以上のクラスとインターフェイスで構成される、type.dllやapplication.exeなどの移植可能な実行可能ファイルです。 複数の名前空間が、単一モジュールに含まれることがあります。また、1 つの名前空間が複数のモジュールにまたがることもあります。

0Like

Comments

  1. @morishima0524

    Questioner

    @radian-jp
    早速回答ありがとうございます。

    引用元のリンクが間違っているようでした。正しくは、こちらですね。(引用された文章で検索して見つけた)
    https://learn.microsoft.com/ja-jp/dotnet/api/system.reflection.module?view=net-7.0#remarks

    1 つの単位として配置される 1 つ以上のモジュールによってアセンブリが構成されます。

    という記載とも併せて考えると、以下のようになるということですね。

    • アセンブリは、1つ以上のモジュールからなる
    • モジュールは、1つ以上のクラスやインタフェースからなる
    • モジュールは、1つ以上の名前空間を含む

    名前空間とモジュールの関係は単純な上下(包含)関係ではないんですね。

  2. おっと、リンク先違ってたみたいですね、失礼しました。
    修正しました。

    余談ですが、VB.NETだとVB6にあった標準モジュール的な機能を実現するためのModuleステートメントがありますが、こちらはまた別物です。

Your answer might help someone💌