How to load assemblies located in a folder in .net core console app

前端 未结 8 1060
甜味超标
甜味超标 2020-11-28 07:06

I\'m making a console app on .Net Core platform and was wondering, how does one load assemblies (.dll files) and instantiate classes using C# dynamic features? It seems so m

8条回答
  •  执念已碎
    2020-11-28 07:23

    Not sure if it's the best way to do it but here's what I came up with:

    (Only tested on .Net Core RC2 - Windows)

    using System;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.Loader;
    using Microsoft.Extensions.DependencyModel;
    
    namespace AssemblyLoadingDynamic
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                var asl = new AssemblyLoader();
                var asm = asl.LoadFromAssemblyPath(@"C:\Location\Of\" + "SampleClassLib.dll");
    
                var type = asm.GetType("MyClassLib.SampleClasses.Sample");
                dynamic obj = Activator.CreateInstance(type);
                Console.WriteLine(obj.SayHello("John Doe"));
            }
    
            public class AssemblyLoader : AssemblyLoadContext
            {
                // Not exactly sure about this
                protected override Assembly Load(AssemblyName assemblyName)
                {
                    var deps = DependencyContext.Default;
                    var res = deps.CompileLibraries.Where(d => d.Name.Contains(assemblyName.Name)).ToList();
                    var assembly = Assembly.Load(new AssemblyName(res.First().Name));
                    return assembly;
                }
            }
        }
    }
    

    MyClassLib.SampleClasses is the namespace and Sample is the type aka class name.

    When executed, it will try to load the SampleClassLib.dll compiled class library in the memory and gives my console app access to MyClassLib.SampleClasses.Sample (take a look at the question) then my app calls the method SayHello() and passes "John Doe" as name to it, Therefore the program prints:

    "Hello John Doe"

    Quick note: The override for the method Load doesn't matter so you might as well just replace its content with throw new NotImplementedException() and it shouldn't affect anything we care about.

提交回复
热议问题