概要

アセンブリといえばアセンブラ言語(機械語)だけど、なんか C# ではそうとは限らないらしいぞ。流し読みノート書いてく。

 

流し読みノート

アセンブリってなんや

  • exe(実行形式)とか dll(ダイナミックリンクライブラリ)の拡張子のファイルを見たことがあるだろう。アレ。
    • C# の場合、あれはコンパイラが作ったもので、 C# コードが IL に変換されて、 PE(Win32 Portable Executable)っていうフォーマットで書かれている。
    • だから PE を解釈できるツールならアセンブリをちゃんと認識するけれど、古い Win32 ツールなどを使うと、アセンブリ内に何もないように見えてしまう。
  • 「配布単位」「ソフトウェアコンポーネント」って呼ばれている。
  • 6章で出てきた internal アクセシビリティは、この単位内でのアクセスを有効にするやつ。
  • アセンブリは複数ファイルのセット……モジュール……にすることもできるけれど普通じゃないしおすすめもしない。ただ「アセンブリはつねに単一ファイル」というのは間違いだということだけ注意。
    • てか Visual Studio にそんなオプションがないしフツーにしてたら不可能。コマンドラインで作業したり、プロジェクトファイルを編集しないと出来ない。

 

どうロードするんや

  • ライブラリみたいなもんだからロードしなきゃいけない。 C# 書くときにとりあえずプロジェクト作るんだけど、まずはプロジェクトにアセンブリへの参照を追加しないといけない。
    • が、共通的に使用されるクラスライブラリへの参照は Visual Studio が勝手に追加してくれるから、基本的には何もしなくていい。
    • 勝手に追加するけど、プロジェクト内で使っていなければコンパイラはその参照を無視してくれる。余分なアセンブリをロードしてしまう、なんてことがないから、何もしなくていい(わざわざ使わない参照を削除しなくてもいい)。ええやん。
  • クラスライブラリは GAC(Global Assembly Cache)ってところに置いてある。具体的には C:\Windows\assembly とか。 CLR はアセンブリをロードするとき、まずはここから探し始める。
  • すべての型(クラス)は何らかのアセンブリに属しているから、↓のようにアセンブリの情報を見れる。
// 文字列型の情報を見てみる。
System.Type t = typeof(System.String);

// System.String という型自体の名前
Console.WriteLine(t.FullName);
// System.String と出る。そりゃ、わかっとる。

// System.String があるアセンブリの名前。
Console.WriteLine(t.Assembly.FullName);
// mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 と出る。ぉおー。

 

アセンブリ名の見方

↑で表示してみた System.String のあるアセンブリ名を軸に見てみる。

  • mscorlib: 単純名という。通常、ファイル名から拡張子を取り去った名前と同じ。
  • Version=4.0.0.0: バージョン。最大値は 65534.65534.65534.65534
    • 左から「メジャーバージョン」「マイナーバージョン」「ビルド」「リビジョン」。
      • メジャーバージョン、マイナーバージョン: 既存コードに悪影響を及ぼすような変更があるとき変更。
      • ビルド: とくに外見上の変更を伴わないときに変更。
      • リビジョン: 同じソースコードからビルドして、ビルド時刻だけが違うときに変更。
    • 極論を言えばバージョンは型の一部。だってバージョン変わったら動きが変わる(可能性がある)んだからね。
      • だけど CLR にバージョン番号を考慮してほしいときは、下で述べる厳密名をつけないといけない。
  • Culture=neutral: こないだ LINQ の章でちょっと使った CultureInfo のことだね。リソースの種類を切り替えるのに使うみたい。たとえば言語とかね。
  • PublicKeyToken=b77a5c561934e089: 公開キートークン。これがついているとき、このアセンブリ名は厳密名(strong name)であるという。デフォルトは null
    • 厳密名をもつアセンブリだけが、上述した Global Assembly Cache に入れる。
  • 他に、オプションとしてプロセッサアーキテクチャを指定できるみたい。
    • ProcessorArchitecture=amd64 みたいな感じで。

 

小休憩

「クラスを書くと、最終的にアセンブリができます。」という一節がちょっと印象的だった。 C# を実行するときはアセンブリじゃないといけないんだから、 C# 書く奴はアセンブリを作るためにコードを書いているというわけだ。

この章には誤植がいくつかあった。そして「この部分、著者ジョークのつもりらしいけど何がおもしろのかさっぱりわからない」みたいな余計な訳注が入ったりしていた。不要すぎ。逆に、すてきな訳者といえば思い出すのは、チヌア・アチェベ『崩れゆく絆』だ……。

翻訳者さんによる後書きにこんなこと書いてあった。翻訳作業中、「アチェベがいま、日本語でこの小説を書いたらどんなふうになるか」、この言葉がつねに立ち返るべき原点となっていた、と。うんうん、どんな作業を行うにしてもこういう一本の柱があるのはよいことだよな。いい文章でした。

チヌア・アチェベ『崩れゆく絆』