【Unity+VSCode】NuGet包导入
之前写过一篇用vs手动导入的https://blog.csdn.net/m0_73117967/article/details/132510315?spm=1001.2014.3001.5501
但是最近博主换vscode了,vscode本身没有nuget包管理器,而且也不是每一个nuget包导进来都找得到lib文件夹,折腾了一下发现还是别人的插件好用哈,直接git导插件就行了
https://github.com/GlitchEnzo/NuGetForUnity#
再补点概念
nuget包: 可以理解成针对.NET/C#的工具类库,写程序时,经常需要别人写好的库。这些库就会打包成一个 NuGet 包,里面包含了代码、依赖信息和版本号。
.NET: 总概念 / 平台规范,提供了一套运行环境和工具库,C# 代码需要在 .NET 的环境里运行,.NET 会帮你编译、执行、管理内存、处理跨平台兼容.
.NET框架: .NET 在 Windows 上的一个具体实现
例子对比
-
.NET = 汽车设计图 + 制造规范
-
.NET 框架 = 只在美国市场生产的某款车型
-
.NET Core/Mono/IL2CPP = 其他国家或平台的改装版本
.NET框架构建流程
[C# 源码]│ (编译器 Roslyn)▼
[IL (中间语言) + 元数据] ← DLL/EXE│ (CLR JIT 编译)▼
[机器码] → CPU 执行
-
编译器只负责把源码变成 IL。
-
CLR(Common Language Runtime) 在运行时(Just-In-Time, JIT)把 IL 转成机器码并执行。
unity为了跨平台,并没有用CLR,只是使用了.net的语法和工具库
IL2CPP 构建模式
[C# 源码]│ (编译器 Roslyn)▼
[IL (中间语言)]│ (IL2CPP 转换)▼
[C++ 源码]│ (平台原生 C++ 编译器, 如 clang/msvc)▼
[机器码] → CPU 执行
-
Unity 不依赖 CLR 的 JIT。
-
它把 IL 提前(AOT,Ahead-Of-Time)转成 C++,再编译成机器码。
-
好处是更快、更安全、跨平台更强。
NuGet 包里一般就是一些 C# 源码编译后的 DLL(IL 中间语言),因此,有概率出现一些用了反射动态类型的依赖JIT动态编译的nuget包无法在IL2CPP构建下运行,这时候可以换Mono构建
Mono构建模式
[C# 源码]│ (C# 编译器 Roslyn)▼
[IL (中间语言) + 元数据] ← DLL/Assembly│ (Mono 运行时)▼
[JIT 编译器(Just-In-Time)]▼
[机器码] → CPU 执行
-
Unity 编辑器play时使用 Mono 运行时(Mono CLR) 来执行 C# 脚本
-
完整支持反射和动态生成代码
-
IL2CPP 只在 正式构建(Build)发布版本 时使用
总结
C# 源码 → 编译器 → IL(中间语言) → CLR(JIT/AOT) → 机器码 → CPU
其实就是IL编译成机器码时的方法不一样,导致了一些坑