之前写过一篇用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编译成机器码时的方法不一样,导致了一些坑

更多推荐