首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Assembly.Load性能影响

Assembly.Load性能影响
EN

Stack Overflow用户
提问于 2012-09-04 10:21:37
回答 4查看 3.9K关注 0票数 4

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

当触发发生时,我需要对一个类型的实例执行方法。由于我使用依赖项注入,所以将接口名保存到数据库中(格式为"Namespace.IInterface, AssemblyName")

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

代码语言:javascript
复制
Assembly assembly = System.Reflection.Assembly.Load(assemblyName);
Type service = assembly.GetType(typeName);
object instance = IOCContainer.Resolve(service);

我的问题是:

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

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-04 10:31:40

  • 如果您使用的typeName包含程序集名称(类似于MyNamespace.MyType, MyAssembly version=1.0.0.0,publicKeyToken=12345etc),那么Type.Load(typeName)将得到您的类型,但不为null;
  • CLR只负责加载程序集一次(每上下文一次,详情在这里,在您的情况下,上下文保持不变,因此答案是您应该放松,将缓存留给CLR:)。
票数 5
EN

Stack Overflow用户

发布于 2012-09-04 10:32:15

如果我确信包含程序集已经加载到应用程序域中,那么是否有更好的方法从其名称中获取Type实例?(我尝试了简单的Type.Load(typeName),但获得了null)

不是的。

如果程序集已经加载,CLR是否会优化该过程(使用已加载的程序集)

是。

每个程序集只加载一次。

票数 3
EN

Stack Overflow用户

发布于 2012-09-04 13:34:39

如果程序集已经加载,CLR是否会优化该过程(使用已加载的程序集)

对这个问题的回答是关于MSDN文章第二步 of 运行时如何定位程序集的。

如果请求的程序集具有,则在以前的calls__中也请求,则公共语言运行库使用已经加载的__程序集。在命名组成应用程序的程序集时,这可能会产生影响。有关命名程序集的详细信息,请参阅http://msdn.microsoft.com/en-us/library/k8xx4k69

与这个问题没有直接关系,但也很有用:

如果以前对程序集的请求失败,则对程序集的后续请求将立即失败,而无需尝试加载程序集。从.NET框架版本2.0开始,缓存程序集绑定失败,并使用缓存的信息来确定是否尝试加载程序集。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12261447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档