簡體   English   中英

如何將當前應用程序域的程序集動態加載到 C# 項目?

[英]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 referenceAssembly1、Assembly2 和 Assembly3 的add reference並執行:

Assembly3.Class1 testClass=new Assembly3.Class1();

我也不例外

我只是想知道我做錯了什么? 如何將程序集動態加載到項目中。 我猜因為Class1實例的創建依賴於另一個程序集Assembly1Assembly2 ,所以它失敗了。 那么,如何將所有依賴程序集動態加載到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM