gpt4 book ai didi

c# - 通过反射加载的 DLL 是否被缓存?

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:47 25 4
gpt4 key购买 nike

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

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

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

最佳答案

程序集一旦加载就无法卸载(除非您卸载加载它的完整 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 :-)

关于c# - 通过反射加载的 DLL 是否被缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29562886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com