dotnet core获取依赖注入的已加载程序集列表

时间:2017-06-22 19:48:36

标签: c# dependency-injection .net-core

我使用AutoFac根据其接口实现自动注册依赖项,如下所示:

builder.RegisterAssemblyTypes(Assembly.GetEntryAssembly()).AsImplementedInterfaces();

这适用于入口程序集,但是所有相关程序集呢?

我想做类似的事情:

IList<Assembly> assemblies = GetLoadedAssemblies();
foreach(var assembly in assemblies)
{
  builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
}

我已经使用AssemblyLoadContext等搜索并查看了一堆.netcore 1.0内容,但1.1中似乎不再存在。基本上,当你搜索时,你会得到许多过时的引用,这些引用不再适用。

必须能够获得当前加载的程序集。

我该怎么做?

2 个答案:

答案 0 :(得分:6)

在.NET Core 2.0中有很多API来自.NET Framework,其中有AppDomain.CurrentDomain.GetAssemblies(),它允许您获取已加载到应用程序域的执行上下文中的程序集。当然,这个概念并没有完全从.NET Framework移植到.NET Core,因此您无法创建自己的应用程序域并将它们视为单个进程内的隔离单元(因此您只有一个应用程序域)。但这足以满足您的目标。

答案 1 :(得分:0)

您可以使用与.netstandard 1.6一起使用的Scrutor,或者查看他们如何使用here.

    public IImplementationTypeSelector FromAssemblyDependencies(Assembly assembly)
    {
        Preconditions.NotNull(assembly, nameof(assembly));

        var assemblies = new List<Assembly> { assembly };

        try
        {
            var dependencyNames = assembly.GetReferencedAssemblies();

            foreach (var dependencyName in dependencyNames)
            {
                try
                {
                    // Try to load the referenced assembly...
                    assemblies.Add(Assembly.Load(dependencyName));
                }
                catch
                {
                    // Failed to load assembly. Skip it.
                }
            }

            return InternalFromAssemblies(assemblies);
        }
        catch
        {
            return InternalFromAssemblies(assemblies);
        }
   }