如何将当前应用程序域的程序集动态加载到 C# 项目?

ANe*_*own 5 .net c# .net-assembly

我正在尝试将第三方assemblies 动态加载到项目中并用于reflection创建其类型的实例。

我用了:

Assembly.LoadFrom("Assembly1.dll")
Assembly.LoadFrom("Assembly2.dll")
Assembly.LoadFrom("Assembly3.dll") 
Run Code Online (Sandbox Code Playgroud)

另外,试过:

AppDomain.CurrentDomain.Load("Assembly1.dll")
AppDomain.CurrentDomain.Load("Assembly2.dll")
AppDomain.CurrentDomain.Load("Assembly3.dll") 
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

但是,如果我直接在项目中add referenceAssembly1、Assembly2 和Assembly3执行以下操作:

Assembly3.Class1 testClass=new Assembly3.Class1();
Run Code Online (Sandbox Code Playgroud)

我也不例外

我只是想知道我做错了什么?如何将程序集动态加载到项目中。我猜,因为创建Class1实例依赖于另一个程序集Assembly1Assembly2,所以它的失败。那么,如何将所有依赖程序集动态加载到appdomain/loadcontext.

非常感谢您的回答。

Arc*_*ith 1

为了解决依赖关系,您需要处理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);
    }
}
Run Code Online (Sandbox Code Playgroud)

MyAssemblyResolveHandler为每个未加载的程序集触发,包括依赖项。