Assembly.Load性能影响

Gor*_*vic 4 c# clr performance system.reflection .net-assembly

我正在开发一个组件,它执行使用ioc注册的任何接口的临时方法,执行时刻取决于不同的触发器.它必须能够保存要对数据库执行的操作,因此我将方法名称,类型和参数列表(序列化为BLOB)保存到数据库中,直到需要为止.

当触发发生时,我需要在类型的实例上执行方法.因为我正在使用依赖注入,我将接口名称保存到数据库中(格式"Namespace.IInterface, AssemblyName")

Resolve<IInterface>()在ioc容器上运行方法,我需要它的实例Type:

Assembly assembly = System.Reflection.Assembly.Load(assemblyName);
Type service = assembly.GetType(typeName);
object instance = IOCContainer.Resolve(service);
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 如果我确定包含程序集已经加载到应用程序域中,是否有更好的方法从其名称获取Type实例?(我试过简单Type.Load(typeName)但得到了null)
  • 如果已加载有问题的程序集,CLR会优化该进程(使用已加载),还是需要手动缓存程序集列表以防止反复加载同一程序集的性能影响?

ale*_*x.b 5

  • 如果typeName您使用包含程序集名称(类似MyNamespace.MyType, MyAssembly version=1.0.0.0,publicKeyToken=12345etc),那么Type.Load(typeName)将获得您的类型但不是null;
  • CLR只负载一次加载程序集(每个上下文一次,详细信息在这里,在你的情况下上下文保持不变,所以答案是你应该放松并将缓存保留到CLR :)).