CLRノート:2.生成、パッケージング、導入、管理


2.1.NET Framework導入目標
非.NETプログラムの問題:
  1.DLL hell
2.インストールが複雑です.ディレクトリ分散、レジストリ、ショートカット
3.セキュリティ.悪意のあるコードをこっそりダウンロード
2.2モジュールへのタイプの統合——コンパイラツールcsc
  csc/out:Program.exe/t:exe/r:Mscorlib.dll Program.cs
C#はMscorlib.dllを自動的に参照するので、/r:Mscorlib.dllは省略できます
C#はデフォルトでexe(CUI)を生成するので、/t:exeは省略できます.dll(プログラムセット/t:library)とGUI(ビジュアルアプリケーション/t:winexe)の場合は省略できません
C#デフォルトはProgram.exeにコンパイルされているので、/out:Program.exeは省略できます
最後に以下のように簡略化されます.
  csc Program.cs
Mscorlib.dllをデフォルトで参照しない場合は、/nostdlibスイッチを使用します.
  csc/nostdlib Program.cs
注意:/tは/target、/rは/referenceと書くことができます.
/reference:参照するdllを指定し、完全なパスを使用できます.不完全な場合は、次のディレクトリを順に検索します.
1.作業ディレクトリ(コンパイルするcsファイルの場所)
2.システムディレクトリ(csc.exe所在)
3./libスイッチ指定ディレクトリ
4.LIBシステム変数指定ディレクトリ
応答ファイル(Response File)
一連のコンパイラコマンドラインスイッチが含まれています.cscを実行すると開きます.たとえば、MyProject.rspには次のテキストがあります.
  /out:Program.exe
  /t:exe
  /r:Mscorlib.dll
では、[email protected] Program.csを呼び出します.
この応答ファイルの場所は、cscコマンドを実行するときに、まず現在のディレクトリ(Program.csがある)で検索します.その後、システムディレクトリ(csc.exeがある)で検索し、以前のものがあれば検索します.
/noconfigスイッチを使用してrspファイルを無視することを指定します
2.3メタデータの概要
3つのカテゴリのテーブル:定義テーブル、参照テーブル、インベントリテーブル
1.一般的な定義表:ModuleDef,TypeDef,MethodDef,FieldDef,ParamDef,PropertyDef,EventDef
2.一般的な参照表:AssemblyRef,ModuleRef,Type ref,MemberRef
3.一般的なリスト表:AssemblyDef,FileDef,ManifestResourceDef,ExportedType-Def
2.4モジュールを結合して一つのプログラムセットを構成する
CLRは、常にリストテーブルを含むファイルを最初にロードし、その後、このリストを使用して他のファイルをロードします.
マルチファイル・プログラム・セットを使用する3つの理由:
1.カテゴリ別にタイプを分け、異なるプログラムセットに配置する
2.リソース/データファイルを追加し、AL.exeを使用してプログラムセットの一部にすることができます.
3.プログラムセットの各種類は異なる言語で実現でき、その後ILAsmを用いてILを生成する
csc/t:module A.csはコンパイラがリスト表を含まないリストファイルを生成することを示し、一般的には常にDLLであり、生成されたファイルはA.netmodule
次に、このnetmoduleファイルをリストテーブルのあるプログラムセットに添付し、addmoduleスイッチを使用します.
csc/out:FinalAssmbly.dll/t:library/addmodule:A.netmodule B.csここでB.csはリスト表を含み、最終的にFinalAssmbly.dllを生成し、A.netmoduleが存在しない場合、一緒にエラーを報告します.ただし、プログラムを実行する場合、A.netmoduleは存在しなくてもよく、そのメソッドが呼び出された場合にのみ、A.netmoduleがロードされます.
VS 2005ではマルチファイルセットの作成はサポートされていません.
VS 2005で参照を追加した「.NETオプション」、対応レジストリでHKEY_LOCAL_MACHINESOFTAREMicrosoft.NETframeworkAssemblyFolders,動的にキー値を追加し,VS 2005は対応するディレクトリの下でdllを見つけ,「.NETオプション」にロードすることができる.
ILのToken:0 x 2600000010000001は行番号、0 x 26はFileRef、また0 x 01=TypeRef、0 x 02=TypeDef、0 x 03=AssemblyRef、0 x 27=ExportedType.
AL.exeプログラムセットリンク
リストファイルのみを含むDLLを生成します.ILコードは含まれません.次の生成はFinalAssmbly.dllです.
  AL/out:FinalAssmbly.dll/t:library/addmodule:A.netmodule B.netmodule
CUIまたはGUIを生成することもできますが、/mainスイッチを追加するため、エントリメソッドを指定することはめったにありません.
  AL/out:FinalAssmbly.dll/t:exe/main:Program.Main/addmodule:A.netmodule B.netmodule
プログラムセットにリソースファイルが含まれており、本には3つのスイッチが記載されています./embled[resource] , ManifestResourceDef—— csc /resource
/link[resource] , ManifestResourceDef FileDef, csc /linkresource
/win32res Win32
/win32icon ico

2.5プログラムセットバージョンリソース情報
これらの情報は、System.Diagnostics.FileVersionInfoの静的メソッドGetVersionInfoを使用して取得します.VS 2005では、これらの情報はAssemblyInfo.csに格納される.
ALを使用してプログラムセットを生成する場合、スイッチを指定してこれらの情報を構成することができ、表は省略する(本を参照)
2.6言語文化
付属プログラムセットsatellite assemblyは、特定の言語文化を使用してタグ付けされたプログラムセットです.
ALを使用する場合、/[culture]:textで言語文化を指定します.ここでtextはen-US、zh-CNなどです.カスタム属性を使用して、プログラムセットに直接書き込むこともできます.
  [assembly:AssemblyCulture("en-US")]
System.Resource.ResourceManagerを使用して、付属プログラムセットのリソースにアクセスします.
2.7シンプルなアプリケーションの導入
このセクションでは、アプリケーションと同じディレクトリに配置されたプログラムセットであるプライベート配置方法について説明します.
2.8簡単な管理制御
CLR位置決めプログラムセットAの場合、
ニュートラルneatual言語文化では、プロファイルprivatePathのプロパティ順に、privatePathが指定したディレクトリをスキャンして、必要なディレクトリが見つかるまでスキャンします.A.dllを探して、次のようにします.AppDirAsmName.dll
AppDirAsmNameAsmName.dll
AppDirfirstPrivatePathAsmName.dll
AppDirfirstPrivatePathAsmNameAsmName.dll
AppDirsecondPrivatePathAsmName.dll
AppDirsecondPrivatePathAsmNameAsmName.dll
, A.exe
付属プログラムセットは同じルールに従っていますが、ディレクトリがprivatePath+「文化名(en-USなど、dllを探してからexeを探します.見つからない場合は、文化名をenに変更し、やり直します」