在运行时加载程序集

我的项目是一个应用程序,我们在其中加载各种程序集并对它们执行操作。

我们陷入了这样一种情况:我们需要添加对我们加载的程序集的引用(将由用户选择)。 所以我需要在运行时添加对DLL的引用。

我试过这个网站,但在这里他们只支持像System.Security等微软DLL。我想添加对用户创建的dll(类库)的引用。

您不能在运行时“添加引用” – 但您可以加载程序集 – Assembly.LoadFrom / Assembly.LoadFile等。问题是除非使用AppDomain否则无法卸载它们。 拥有Assembly ,可以使用assemblyInstance.GetType(fullyQualifiedTypeName)通过reflection创建实例(然后可以将其转换为已知接口等)。

对于一个简单的例子:

 // just a random dll I have locally... Assembly asm = Assembly.LoadFile(@"d:\protobuf-net.dll"); Type type = asm.GetType("ProtoBuf.ProtoContractAttribute"); object instance = Activator.CreateInstance(type); 

此时我可以将instance转换为已知的基类型/接口,或者继续使用reflection来操作它。

如果程序集位于当前位置或GAC中的其他位置,请使用AppDomain.CurrentDomain.AssemblyResolve事件自行传递程序集。

如果在运行时加载程序集,它将在当前位置或GAC中查找其所有依赖项,并在找到时加载它们,否则出错。

Composite UI Application Block在三个方面促进了客户端应用程序的设计和实现:

  • 它允许您的应用程序基于模块或插件的概念。
  • 它允许具有shell专业知识的开发人员构建隐藏用户界面复杂性的业务逻辑开发组件。
  • 它有助于使用模式进行开发,以便模块之间松散耦

对于WPF:看看Prism:模式和实践WPF和Silverlight站点的复合应用程序指南它执行您需要的程序集加载,并在内部实际使用Unity,因为它是IoC容器。

对于非WPF:看看智能客户端 – 复合UI应用程序块

或者:尝试任何IoC容器,如Castle Windsor ,autofac,unity等。