[英]How to load assemblies to the current app domain to the c# project dynamically?
我正在嘗試將第三方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
對Assembly1、Assembly2 和 Assembly3 的add reference
並執行:
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”描述的無限循環。
所以我嘗試了幾件事。 以下是通過 MSDN 的 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"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.