反射加载的DLL是否被缓存?

时间:2015-04-10 13:35:43

标签: c# .net caching dll reflection

我有一个应用程序可以根据需要通过反射加载Type,因为实现可能会被配置更改。 这是一个示例代码:

var myObject = Activator.CreateInstance(Type.GetType("MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1r46a5dfa04dase2"))as IMyClass

我的问题是,这个Type默认是缓存的,或者每次都会重新加载,如果没有,我如何缓存它以提高性能?

2 个答案:

答案 0 :(得分:0)

与实例不同,单个类型及其包含的程序集一旦使用就不会被卸载(假设只有一个AppDomain),所以基本上答案是肯定的,有一个缓存。

另请看这里: Can you remove an Add-ed Type in PowerShell again?

答案 1 :(得分:0)

加载后,无法卸载程序集(除非您卸载加载它的完整AppDomain)(请参阅例如How to unload an assembly from the primary AppDomain?)。所以你的问题就出现了相反的问题: - )

现在......你肯定可以加快一切:

Type myType = Type.GetType("MyAssembly.MyClass, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1r46a5dfa04dase2");

每次都需要执行此调用。虽然不会加载程序集,但将在程序集中进行搜索。您可以缓存myType

var myObject = Activator.CreateInstance(myType) as IMyClass;

这将每次都为myType搜索无参数构造函数。你可以通过缓存你需要的构造函数(myConstructor)来加速这个:

ConstructorInfo myConstructor = myType.GetConstructor(Type.EmptyTypes);

var myObject = myConstructor.Invoke(null) as IMyClass;

现在......即使使用反射也很慢......你可以创建一个动态方法来调用构造函数并缓存它:

Func<IMyClass> myCreate = Expression.Lambda<Func<IMyClass>>(Expression.New(myConstructor)).Compile();

var myObject = myCreate();

所以最后你只能缓存myCreate: - )