学习大纲
一. 什么是程序集?
程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件**.exe和类库文件.dll**)。由于程序集在编译后并不一定会生成单个文件,而可能会生成多个物理文件,甚至可能会生成分布在不同位置的多个物理文件,所以程序集是一个逻辑单元,而不是一个物理单元。即程序集在逻辑上是一个编译单元,但在物理储存上可以有多种存在形式。对于静态程序集可以生成单个或多个文件,而动态程序集是存在于内存中的。在C#中程序集处处可见,因为任何基于.NET的代码在编译时都至少存在一个程序集。
基于.NET框架的.dll库是一个完整的程序集,需要事先引用对应的类库。从代码的结构上看,一个程序集可以包含一个或多个命名空间,而每个命名空间中又可以包含子命名空间或类型列表。由于程序集在编译后可以生成多个模块文件,因此一个物理文件并不代表它就是一个程序集,一个程序集并不一定只有一个文件。在VS开发环境中,一个解决方案可以包含多个项目,而每个项目就是一个程序集。
应用程序结构:包含 应用程序域(AppDomain),程序集(Assembly),模块(Module),类型(Type),成员(EventInfo、FieldInfo、MethodInfo、PropertyInfo) 几个层次。
二. 为什么使用程序集?
- 开发者可以自定义程序集,定义明晰的依赖关系,可以确保脚本更改后,只会重新生成必需的程序集,减少编译时间。
- 可以跨项目进行程序的复用,加快开发效率
- 支持跨语言的编程,例如可以在unity中使用C++语言编辑的DLL文件
三. 如何在Unity中使用程序集
1.基本常识
- 在Assets文件夹中编写脚本,如果没有进行自定义操作,会默认编译到 Assembly-CSharp.dll 中。
- 开发过程中如果进行了编辑器扩展,创建了Editor文件夹,并在该目录下编写了脚本,则默认编译到Assembly-CSharp-Editor.dll文件中。
- DLL文件的生成路径:项目路径\Library\ScriptAssemblies\xxxx.dll
2.自定义程序集
- 创建一个新的文件夹(之所以不在Assets根目录下直接创建程序集,因为根目录下创建的程序集会取代Assembly-CSharp.dll)
2.通过 Assets > Create > Assembly Definition,也可以直接通过右键菜单创建。
创建效果如下所示:
与新建的程序集处于同一层级或者处于子层级的所有脚本都编译到该程序集。
3. 多层级的程序集
在上面的步骤中我们讲到:在文件夹中创建Assembly Defienitions时,Unity将从该文件夹中的所有脚本编译到一个单独的托管程序集,并包含所有子文件夹的定义。
如果子文件夹具有自己的程序集定义,该文件夹中的所有脚本及其子文件夹中的脚本编译到一个单独的托管程序集,这些托管程序集充当Unity项目中的单个库。
图片一目了然:
4. Assembly Definition Reference
细心的同学可能发现创建程序集的时候下面还有一个Assembly Definition Reference 选项,下面是一些注意事项:
- 每个文件夹只能创建一个“Assembly Definition”或“Assembly Definition Reference”。
- Use GUID 选项
- 参看下面的面板详解。
四. 程序集 Inspector 面板详解
【Name】:程序集的名称(不带文件扩展名); 程序集名称在整个项目中必须唯一。
【General】:
- Allow ‘unsafe’ code:如果程序集中使用了Unsafe关键字,需要勾选此选项,否则报错
- Auto Referenced:指定是否所有预定义程序集都应引用此程序集。
- Override References:启用后以手动方式确认引用哪些程序集
- No Engine References:启用此属性后,Unity在编译程序集时不会向UnityEditor或UnityEngine添加引用。
【Define Constraints】:指定必须定义的编译器#define指令,才能编译或引用程序集。
【Assembly Definition References】:指定对使用 Assembly Defienitions 创建的其他程序集的引用。
【Platforms】:设置发布平台
【Version Defines】:
Resource:选择要为其设置Define的包或模块。 该列表包含项目中所有活动的软件包和模块。
Define:设置Define的名称。 仅当Expression返回true时才设置此定义。
Expression:选择的模块或软件包的语义版本范围。 必须使用数学间隔符号。 不支持通配符。 该版本使用与Microsoft .NET软件包管理器NuGet相同的版本范围。
Expression outcome:Expression代表的数学方程式。
参考文章: