Unity中的程序集(Assembly)


程序集
官文:Manual/ScriptCompilationAssemblyDefinitionFiles.html
1)默認的程序集:Assembly-CSharp.dll、Assembly-CSharp-Editor.dll
Unity將默認創建的腳本編譯到 Assembly-CSharp.dll
可以在項目路徑->Library->ScriptAssemblies目錄下找到它
同時,選擇腳本,在Inspector面板中也可以看到程序集的信息
在VS中打開解決方案管理器窗口,也可以看到Assembly-CSharp的字樣
如果在Asset下創建一個Editor文件夾並在該文件夾內創建腳本,Unity會自動的生成 Assembly-CSharp-Editor程序集。
新版Unity的PackageManager功能則使用了多個程序集,即一個插件就是一個程序集,編譯成為一個dll,例如TextMeshPro.

2)程序集與命名空間的區別?
1. 命名空間與程序集的區別
      命名空間用於對類型進行邏輯分組。程序集則是程序的物理分組,對應於一個dll或exe文件。
2. 為什么要使用兩種方式分組?把邏輯分組作為物理分組不是更簡單嗎?
     邏輯分組主要針對開發人員,而物理分組主要針對安裝和部署。
     除此之外,以下情況也需要使用兩種方式分組,否則會很不方便。
     1)團隊開發。一個公司分處不同的部門共同開發同一個命名控件的不同類型。那么不同的部門可以把他們開發的東西編譯成各自的dll文件。使用時把幾個dll一起引用即可。
      2)一個命名控件里包含的類型太多,而有大部分是用不上的。如果把一個命名空間編譯成一個dll,則會降低運行效率。
      3)有時需要對一個命名空間內的類型區別對待。如果打算開發一個系列軟件,該軟件分普通版,專業版,高級版。越高的版本具有越高的權限(當中包含了一些高級的類),這是可以使用把高級的功能放到一個單獨的dll來控制。

Unity里如何自定義程序集呢?
1)在Assets文件夾下右擊Create->Assembly Definition,就創建了一個自定義的程序集,這些文件的擴展名為 .asmdef,官文中成此創建的文件為 程序集定義文件(AssemblyDefinitionFiles
創建完成之后,會在Library同步生成一個相同名稱的程序集,且 該程序集的同級腳本和同級文件夾下的所有腳本將編譯搭到該程序集中,它甚至會覆蓋到Editor程序集;(實際就是腳本根據目錄就近選擇編譯它的程序集),實際的程序集名稱將使用的是該文件的Name屬而不是程序集文件的文件名,即注意: 程序集定義文件所在的文件夾的名稱以及程序集定義文件的文件名對程序集的名稱沒有影響(但一般會保持一致)
2)程序集的相互引用
選擇一個程序集定義文件,在Inspector面板中添加一個程序集,就可以對該程序集中的類型進行引用了
預定義的程序集“Assembly-CSharp”會自動引用除了測試程序集以外的所有程序集。
Figure 1 - Script compilation
i: 循環依賴?
程序集之間的引用是單項的,不在使用A程序集引用B程序集的同時,再使用B程序集去引用A程序集,否則會產生 循環依賴
這就類似於創建C#控制台程序將應用A添加到B的引用中,又將B添加到A項目的引用中產生循環依賴項。
為何不能產生循環依賴?這是 編譯型語言的編譯機制導致的,當一個程序集A中的腳本修改后,會導致其所在的成程序集A重新編譯,然后引用該程序集的程序集B會重新編譯,如果B引用了A,則B的編譯將觸發A的重新編譯,繼而出現死循環。(編譯?:計算機將程序(代碼)翻譯成機器語言的過程,這就是程序集的化身,c#是編譯語言的一種,而Java即有編譯性,又有解釋性)

ii: 兩個程序集出現同名類?
這種情況下,如果同名類中的一個定義在本程序集中,則本程序集引用同名類會使用本程序集定義的類,編譯器警告;
如果一個程序集同時引用了A,B兩個程序集,而A和B兩個程序集又出現了同名的類,此時引用此類將會出錯,且無法解決。
iii: TestAssembly?測試程序集(寫測試代碼的福音~)
要標記該程序集以進行測試,請在 Inspector 中啟用 Test Assemblies。這樣會在程序集定義文件中添加對 unit.framework.dll 和 UnityEngine.TestRunner.dll 的引用。
在標記程序集以進行測試時,請確保:
預定義的程序集(Assembly-CSharp.dll 等)不會自動引用標記為進行測試的程序集定義文件。
該程序集未包含在正常構建中。要將程序集包含在播放器構建中,請在構建腳本中使用 BuildOptions.IncludeTestAssemblies。請注意,這樣只會在構建中包含程序集,而不會執行任何測試。

iv: Unsafe Code 不安全的代碼
注意:如果在程序集內的腳本中使用 unsafe 關鍵字,必須在 Inspector 中啟用 Allow ‘unsafe’ Code 選項。這樣將在編譯程序集時將 /unsafe 選項傳遞給 C# 編譯器。
可在 Inspector 中為程序集定義文件設置平台兼容性。在此處可選擇排除或包含特定平台。

















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM