C# 面试题 目录

C# 中如何动态加载和卸载程序集?

推荐答案

在C#中,动态加载和卸载程序集可以通过使用System.Reflection命名空间中的Assembly类和AppDomain类来实现。以下是实现动态加载和卸载程序集的步骤:

动态加载程序集

  1. 使用Assembly.LoadFrom方法加载程序集

  2. 使用Assembly.Load方法加载程序集

  3. 使用AppDomain.CurrentDomain.Load方法加载程序集

动态卸载程序集

  1. 创建新的AppDomain

  2. 在新的AppDomain中加载程序集

  3. 卸载AppDomain以卸载程序集

本题详细解读

动态加载程序集

在C#中,程序集是.NET应用程序的基本构建块。动态加载程序集允许你在运行时根据需要加载程序集,而不是在编译时静态引用它们。这在插件架构或需要延迟加载某些功能的场景中非常有用。

  • Assembly.LoadFrom:该方法从指定的路径加载程序集。它适用于加载不在应用程序目录中的程序集。
  • Assembly.Load:该方法通过程序集的名称加载程序集。它适用于加载已经在GAC(全局程序集缓存)或应用程序目录中的程序集。
  • AppDomain.CurrentDomain.Load:该方法在当前应用程序域中加载程序集。它与Assembly.Load类似,但提供了更多的控制。

动态卸载程序集

在.NET中,程序集一旦加载到应用程序域中,就无法直接卸载。为了卸载程序集,必须卸载整个应用程序域。这是因为.NET的垃圾回收机制无法单独卸载程序集。

  • 创建新的AppDomain:通过创建新的应用程序域,你可以在该域中加载程序集,并在不需要时卸载整个域。
  • 在新的AppDomain中加载程序集:在新的应用程序域中加载程序集后,你可以执行该程序集中的代码。
  • 卸载AppDomain:通过卸载应用程序域,你可以释放该域中加载的所有程序集和资源。

注意事项

  • 跨域通信:当你在新的应用程序域中加载程序集时,跨域通信可能会变得复杂。你可能需要使用MarshalByRefObjectRemoting来处理跨域调用。
  • 性能开销:创建和卸载应用程序域会带来一定的性能开销,因此应谨慎使用。

通过上述方法,你可以在C#中实现程序集的动态加载和卸载,从而在运行时灵活地管理程序集。

纠错
反馈