VContainer-optimization/codegen | 优化——预生成 IL 代码(已弃用)
:::danger
已弃用。请改用 Source Generator 源码生成器。
:::
:::caution
需 Unity 2019.3 或更高版本。
:::
VContainer 通过编译时生成 IL 代码提升性能。
运行时无反射开销,速度提升 3-6 倍。
支持 IL2CP。
VContainer 自动生成的代码示例(作为 IL):
class ClassA
{
private sealed class __GeneratedInjector : IInjector
{
public object CreateInstance(IObjectResolver resolver, IReadOnlyList<IInjectParameter> parameters)
{
I6 fromConstructor = resolver.ResolveOrParameter<I6>("fromConstructor1", parameters);
I7 fromConstructor2 = resolver.ResolveOrParameter<I7>("fromConstructor2", parameters);
return new ClassA(fromConstructor, fromConstructor2);
}
public void Inject(object instance, IObjectResolver resolver, IReadOnlyList<IInjectParameter> parameters)
{
ClassA clasA = (ClassA)instance;
I3 service = resolver.ResolveOrParameter<I3>("service3", parameters);
I4 service2 = resolver.ResolveOrParameter<I4>("service4", parameters);
allInjectionFeatureService.MethodInjectable1(service, service2);
I5 service3 = resolver.ResolveOrParameter<I5>("service5", parameters);
I6 service4 = resolver.ResolveOrParameter<I6>("service6", parameters);
classA.MethodInjectable2(service3, service4);
classA.PrivatePropertyInjectable = resolver.Resolve<I2>();
classA.PublicPropertyInjectable = resolver.Resolve<I3>();
classA.privateFieldInjectable = resolver.Resolve<I4>();
classA.PublicFieldInjectable = resolver.Resolve<I5>();
}
}
启用代码生成
1. 添加 VContainer.EnableCodeGen
asmdef 引用
项目中如果有 asmdef 引用了以下两个 asmdef,它们将成为 IL 编织的目标。
VContainer
VContainer.EnableCodeGen
2. 构建程序集
下次编译指定的程序集时,VContainer 会对编译后的 dll 进行修改。
成功后将会记录如下形式日志:
VContainer code generation optimization for MyGame.dll 24 types (40.0355ms)
:::note
Unity 2020.2 及更高版本中,ILPostProcessor 无法再输出日志。
作为临时措施,上述日志会以警告形式显示,但未来可能会移除。
:::