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 中为程序集定义文件设置平台兼容性。在此处可选择排除或包含特定平台。
















posted @ 2020-12-31 11:38  章校长  阅读(7023)  评论(0编辑  收藏  举报