Asp.Net Core:反映一个Asp.Net程序集抛出异常

我目前正在实现一个基本的解决方案,通过反射将服务加载到Asp.Net Core中,而不必传递每一种类型。 为了有一些摆动空间,我创建了一个静态帮助器,使用新的core-reflection类型返回装配类型:

internal static class ReflectionTypeHelper
{
    private static readonly Assembly _currentAssembly = typeof(ServiceContainerInitializer).GetTypeInfo().Assembly;

    internal static IReadOnlyCollection<Type> ScanAssembliesForTypes(Func<Type, bool> predicate)
    {
        var result = new List<Type>();
        var appAssemblies = GetApplicationAssemblies();

        foreach (var ass in appAssemblies)
        {
            var typesFromAssembly = ass.GetTypes().Where(predicate);
            result.AddRange(typesFromAssembly);
        }

        return result;
    }

    private static IEnumerable<Assembly> GetApplicationAssemblies()
    {
        var consideredFileExtensions = new[]
        {
            ".dll",
            ".exe"
        };

        var result = new List<Assembly>();
        var namespaceStartingPart = GetNamespaceStartingPart();

        var assemblyPath = GetPath();
        IEnumerable<string> assemblyFiles = Directory.GetFiles(assemblyPath);

        var fileInfos = assemblyFiles.Select(f => new FileInfo(f));
        fileInfos = fileInfos.Where(f => f.Name.StartsWith(namespaceStartingPart) && consideredFileExtensions.Contains(f.Extension.ToLower()));

        // Net.Core can't load the Services for some reason, so we exclude it at the moment
        //fileInfos = fileInfos.Where(f => f.Name.IndexOf("Services", StringComparison.OrdinalIgnoreCase) == -1);

        foreach (var fi in fileInfos)
        {
            var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(fi.FullName);
            result.Add(assembly);
        }

        return result;
    }

    private static string GetNamespaceStartingPart()
    {
        var fullNamespace = _currentAssembly.FullName;
        var splittedNamespace = fullNamespace.Split('.');

        var result = string.Concat(splittedNamespace[0], ".", splittedNamespace[1]);
        return result;
    }

    private static string GetPath()
    {
        var codeBase = _currentAssembly.CodeBase;
        var uri = new UriBuilder(codeBase);
        var result = Uri.UnescapeDataString(uri.Path);
        result = Path.GetDirectoryName(result);

        return result;
    }
}

正如您可能在代码注释中看到的那样,我无法加载从“ASP.NET核心Web应用程序(.Net Core)”项目模板中创建的“服务” - 大会。

不幸的是,这个例外非常普遍

无法加载文件或程序集'Argusnet.Pis.Services,版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'。

此外,该文件正如预期那样。 我在GitHub-Issues上找到了关于这个主题的一些提示,但它们都在发布候选版本中解决。

有趣的是,所有其他程序集按照您的预期工作,所以必须有关于此程序集类型的特定内容?

编辑:例外的屏幕截图: 在这里输入图像描述


它未能加载的原因之一可能是在编译期间选择的目标处理器体系结构不匹配。 Argusnet.Pis.Services可能使用x86配置进行编译,尝试加载的客户端应用程序可能在编译期间使用x64选项构建,或者相反。 确保两个项目在构建之前都具有相同的选项(x86或x64)。 否则,请尝试使用Any CPU选项构建它们。

链接地址: http://www.djcxy.com/p/21301.html

上一篇: Asp.Net Core: Reflecting an Asp.Net Assembly throw exception

下一篇: Need Help Building ASP.NET Core Source Because of Missing .Net Version