1. 程式人生 > >[From 2.4]C#編譯器和程序集鏈接器(以及一些它們的命令開關)

[From 2.4]C#編譯器和程序集鏈接器(以及一些它們的命令開關)

數據表 記錄 store gui 執行 類型 全局函數 全局 以及

C#編譯器:(用csc命令來使用C#編譯器) 程序集鏈接器(Assembly Linker):(用al命令來使用C#編譯器) 除了使用C#編譯器,還可以使用”程序集鏈接器“使用程序AL.exe來創建程序。 1.如果程序集要包含由不同編譯器生成的模塊(而且這些編譯器不支持與C#編譯器的/addmodule)。 2.可用AL.exe生成只含資源的程序集,也就是所謂的附屬程序集(satellite assembly),它們通常用於本地化。(例子3) 3.能生成EXE文件,或者生成只包含清單(對其他模塊中的類型進行描述)的DLL PE文件。(例子4) C#編譯器支持開關:
  1. /t[arget]:exe,/t[arget]:winexe,/t[arget]:appcontainerexe,/t[arget]:library
    或者/t[arget]:winmdobj.所有這些開關都會造成編譯器生成含有清單元數據表的PE文件,這些開關分別生成CUI執行體,GUI執行體,Windows Store執行體,類庫或者WINMD庫。
  2. 除了這些開關,/t[arget]:module:C#編譯器還支持/t[target]:module開關,這個開關指示編譯器生成一個不包含清單元數據表的PE文件。這樣生成的肯定是一個DLL PE文件。CRL想訪問其中的任何類型,必須先將該文件添加到一個程序集中。使用/t:module開關時,C#編譯器默認為輸出文件使用.netmodule擴展名(例子1)
  3. /addmodule:可通過許多方式將模塊添加到程序集,如果用C#編譯器生成含清單的PE文件,可以使用/addmodule開關。(例子2)
  4. /r[eference]:客戶端代碼必須使用XXX.dll編譯器開關生成,才能使用XXX.dll的程序集的類型。
  5. /resource(C#編譯器獨有,相當於al的/embed[resource]):/resource開關將指定的資源文件嵌入最終生辰的程序集PE文件中,並更新ManifestResouceDef表,
  6. /linkresouce(C#編譯器獨有,相當於al的/link[resource]);/linkresouce開關在ManifestResourceDef和FileDef清單表中添加記錄項來引用獨立存在的資源文件。
AL.exe(程序集鏈接器)支持:(C#編譯器一些支持的AL.exe也支持)
/embed[resource](AL獨有):用AL.exe創建程序集時,可用/embed[resource]開關將文件作為資源添加到程序集。該開關獲取任意文件,並將文件內容嵌入最終的PE文件。清單的ManifestResourceDef表會更新以反映新資源的存在。 /link[resource](AL獨有):它同樣獲取包含資源的文件,但只是更新清單的ManifestResource和FileDef表以反映新資源的存在,指出資源包含在程序集的哪個文件中。資源文件不會嵌入程序集PE文件中:相反,它保持獨立,而且必須和其他程序集文件一起打包和部署。 /main:AL.exe還會生成一個小的全局函數,名為__EntryPoint._實際沒有多大用處,開發人員只需知道有這個開關就可以了。(例子4) /c[ulture]:text開關指定語言文化。例如“en-US”代表英語文化。 /win32res:指定一個.res文件的路徑名。(C#編譯器和程序集鏈接器共有) /win32icon:指定一個.ico文件的路徑名。(C#編譯器和程序集鏈接器共有) 例子1:csc /t:module RUT.cs 上述命令行指示C#編譯器創建名為RUT.netmodule的文件。這是一個標準的DLL PE文件,但是,CLR不能單獨加載它。 例子2:csc /out:MutiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs 上述命令行指示C#編譯器編譯FUT.cs來生成MultiFileLibrary.dll。 由於指定了/t:library開關,所以生成的是含有清單元數據表的DLL PE文件, /addmodule:RUT.netmodule開關告訴編譯器RUT.netmodule文件時程序集的一部分,具體的說,/addmodule開關告訴編譯器將文件添加到FileDef清單元數據表,並將RUT.netmodule的公開導出類型添加到ExportedTypesDef清單元數據表 例子3: csc /t:module RUT.cs csc /t:module FUT.cs al /out:MultiFileLibrary.dll /t:library RUT.netmodule FUT.netmodule 這個例子首先創建兩個單獨的模塊即RUT.netmodule和FUT.netmodule。 然後生成第三個文件MultiFileLibrary.dll,它是DLL PE文件(因為使用了/t[arget]:library開關),不包含IL代碼,但包含清單元數據表,清單元數據表指出RUT.netmodule和FUT.netmodule是程序集的一部分。最終的程序集由三個文件構成:MultiFileLibrary.dll,RUT.netmodule和FUT.netmodule。程序集鏈接器不能將多個文件合並成一個文件。 例子4: csc /t:module /r:MultiFileLibrary.dll Program.cs al /out:Program.exe /t:exe /main:Program.Main Program.netmodule 第一行將Program.cs文件生成為Program.netmodule文件。第二行生成包含清單元數據表的Program.exe PE文件。此外,由於使用了/main:Program.Main命令行開關,AL.exe還會生成一個小的全局函數名為__EntryPoint。(這個函數只是調用了一下在Program.netModule文件定義的Program類型中包含Main方法。並沒有什麽意義,開發者只需要知道由這個開關就可以了。)

[From 2.4]C#編譯器和程序集鏈接器(以及一些它們的命令開關)