C# 在运行时加载程序集

C# 在运行时加载程序集,c#,.net,C#,.net,我的项目是一个应用程序,我们在其中加载各种程序集并对其执行操作 我们陷入了这样一种情况:我们需要添加对加载的程序集的引用(这将由用户选择)。因此,我需要在运行时添加对DLL的引用 我尝试过,但这里它们只支持microsoft dll,如System.Security等。我想添加对用户创建的dll(类库)的引用。如果在运行时加载程序集,它将在当前位置或GAC中查找其所有依赖项,如果找到,则加载它们,否则会出错。您不能“添加引用”在运行时-但您可以加载程序集-Assembly.LoadFrom/As

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

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


我尝试过,但这里它们只支持microsoft dll,如System.Security等。我想添加对用户创建的dll(类库)的引用。

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

您不能“添加引用”在运行时-但您可以加载程序集-
Assembly.LoadFrom
/
Assembly.LoadFile
等。问题是,除非使用
AppDomain
s,否则无法卸载它们。一旦有了
程序集
,就可以使用
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);

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

复合UI应用程序块在三个方面促进了客户端应用程序的设计和实现:

  • 它允许应用程序基于模块或插件的概念
  • 它允许具有shell专业知识的开发人员构建在业务逻辑开发中隐藏用户界面复杂性的组件
  • 它使用模块间松散耦合的模式来促进开发
对于WPF:看一下它是否完成了所需的程序集加载,并且实际上在内部使用Unity作为IoC容器

对于非WPF:请看


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

如果程序集位于当前或GAC之外的其他位置,只需使用
AppDomain.CurrentDomain.AssemblyResolve事件自己交付程序集。

有关信息,代码项目链接实际上是关于编辑Visual Studio项目;不在运行时加载程序集。我想添加对当前visual studio项目的引用,但“visual studio项目”与“在运行时”正好相反。请澄清你的意图。应用程序正在运行吗?或者您是否在Visual Studio designer编辑代码中?应用程序正在运行我想通过右键单击解决方案栏将其添加到引用中,但我想在我的应用程序运行时执行类似操作您是否解决了“null”问题?然后您没有为其提供正确的完全限定名,或者它不存在;Assembly.GetType()甚至可以找到私有类型等。请注意,泛型和嵌套类型的语法与您在C#中看到的略有不同。这里的ProtoBu是什么?是dll名称。我给出了我的dll名称和我需要的类重新组装asm=Assembly.LoadFile(@“C:\Documents and Settings\E454930\Desktop\nunit_dll\u hutt\for_hutt_proj\bin\Debug\for_hutt_proj.dll”);Type Type=asm.GetType(“for_hutt_proj.int”);对象实例=Activator.CreateInstance(类型);这就是我所做的这是个错误