如何将程序集动态加载到当前应用程序域到 c# 项目
本文关键字:项目 应用程序域 加载 程序集 动态 | 更新日期: 2023-09-27 17:55:43
我正在尝试将第三方assemblies
动态加载到项目中,并使用reflection
创建其类型的实例。
我使用过:
Assembly.LoadFrom("Assembly1.dll")
Assembly.LoadFrom("Assembly2.dll")
Assembly.LoadFrom("Assembly3.dll")
另外,尝试过:
AppDomain.CurrentDomain.Load("Assembly1.dll")
AppDomain.CurrentDomain.Load("Assembly2.dll")
AppDomain.CurrentDomain.Load("Assembly3.dll")
但是,当我尝试创建其中一种类型的实例时,我不断收到The method is not implemented
异常,如下所示:
Assembly.LoadFrom("Assembly1.dll")
Assembly.LoadFrom("Assembly2.dll")
Assembly assembly= Assembly.LoadFrom("Assembly3.dll")
Type type=assembly.GetType("Assembly3.Class1")
object instance=Activator.CreateInstance(type); //throws exception at this point
但是,如果我直接add reference
项目中的程序集 1、Assembly2 和 Assembly3 并执行以下操作:
Assembly3.Class1 testClass=new Assembly3.Class1();
我无一例外
我只是想知道我做错了什么?如何将程序集动态加载到项目中。我猜是因为Class1
实例的创建取决于另一个程序集Assembly1
和Assembly2
,所以它失败了。那么,如何将所有依赖程序集动态加载到appdomain/loadcontext
。
非常感谢您的回答。
对于解析依赖项,您需要处理 AppDomain.AssemblyResolve 事件
using System;
using System.Reflection;
class ExampleClass
{
static void Main()
{
AppDomain ad = AppDomain.CurrentDomain;
ad.AssemblyResolve += MyAssemblyResolveHandler;
Assembly assembly = ad.Load("Assembly3.dll");
Type type = assembly.GetType("Assembly3.Class1");
try
{
object instance = Activator.CreateInstance(type);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static Assembly MyAssemblyResolveHandler(object source, ResolveEventArgs e)
{
// Assembly.LoadFrom("Assembly1.dll")
// Assembly.LoadFrom("Assembly2.dll")
return Assembly.Load(e.Name);
}
}
为每个程序集触发的 MyAssemblyResolveHandler 比未加载的程序集,包括依赖项。
使用 "ad.AssemblyResolve += MyAssemblyResolveHandler",我得到了由"cdie"描述的无限循环。
所以我尝试了几件事。 以下是通过 MSDNs LoadFrom 链接
public object InitClassFromExternalAssembly(string dllPath, string className)
{
try
{
Assembly assembly = Assembly.LoadFrom(dllPath);
Type type = assembly.GetType(className);
var instance = Activator.CreateInstance(type);
return instance;
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
显然,Assembly.LoadFrom 方法需要 DLL 的完整路径。
请注意通过链接中的 LoadFrom 加载程序集时可能存在的问题。
此外,上面"ArcangelZith"包含的链接有一些有趣的想法。
如果引用了程序集,您可以这样做以按名称加载它
AppDomain.CurrentDomain.Load(new AssemblyName("Assembly1.Core"))