首页 > 解决方案 > 为什么在 IIS 发布时出现程序集加载错误

问题描述

我创建了一个扩展方法来在我的 asp.net 核心 web api 项目中找到我的接口实现。

    public static List<Type> FromAssembliesMatching<TType>(this AppDomain currentDomain, string searchPattern)
    {
        var referencedPaths = Directory.GetFiles(currentDomain.BaseDirectory, "*.dll").ToList();

        var assemblies = referencedPaths.Select(path => currentDomain.Load(AssemblyName.GetAssemblyName(path)));

        var types = assemblies.SelectMany(s => s.GetTypes().Where(t =>
                typeof(TType).IsAssignableFrom(t)
                && !t.IsInterface
                && !t.IsAbstract))
            .ToList();

        return types;
    }

例如,找到 IMyInterface 实现的类型。这在开发应用程序时有效。

但是当我在iis上发布它时。

System.BadImageFormatException: Could not load file or assembly 'C:\publish\api-ms-win-core-console-l1-1-0.dll'.

用于加载所有 dll 的扩展方法。我认为 c# 生成的 dll 会导致错误。我怎么解决这个问题?

标签: c#.netasp.net-coresystem.reflection

解决方案


这是预期的。

由于您使用的部署方法(自包含),dotnet publish不仅会复制所有托管程序集,还会复制本机依赖项,​​例如api-ms-win-core-console-l1-1-0.dll. 这些原生依赖无法通过反射加载到应用程序域中,因此异常是完全正常的。

你有几个选项来解决它,

  • 捕获异常并忽略它。
  • 或者主动检查 dll 是原生的还是使用PEFile 类和相关管理的。

推荐阅读