在运行时加载程序集

时间:2009-03-13 09:37:02

标签: c# .net

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

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

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

4 个答案:

答案 0 :(得分:8)

您无法在运行时“添加引用” - 但您可以加载程序集 - Assembly.LoadFrom / Assembly.LoadFile等。问题是您无法卸载他们除非你使用AppDomain。获得Assembly后,可以使用assemblyInstance.GetType(fullyQualifiedTypeName)通过反射创建实例(然后可以将其转换为已知接口等)。

一个简单的例子:

// 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转换为已知的基本类型/接口,或者继续使用反射来操作它。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

复合UI应用程序块有助于在三个方面设计和实现客户端应用程序:

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

对于WPF:看一下Prism: patterns & practices Composite Application Guidance for WPF and Silverlight site 它会执行你需要的程序集加载,并且实际上在内部使用Unity,因为它是IoC容器。

对于非WPF:请查看Smart Client - Composite UI Application Block

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