从ASP.Net Core 1.1迁移到2.0时出现BadImageFormatException异常

8
我刚刚将一个ASP.Net Core 1.1应用程序迁移到新发布的2.0版本。现在我遇到了以下异常:
System.BadImageFormatException: '无法加载文件或程序集“dotnet-aspnet-codegenerator-design”或其某个依赖项。尝试加载格式不正确的程序。'
此异常在以下行(AddMvc)上引发:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
    ...
    services.AddMvc(options =>
        {
            options.Filters.Add(new MiddlewareFilterAttribute(typeof(LocalizationPipeline)));
        })
        .AddJsonOptions(options =>
        {
            // Maintain property names during serialization. See:
            // https://github.com/aspnet/Announcements/issues/194
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        })
        .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
        .AddDataAnnotationsLocalization();
}

nasty exception screenshot

我使用的是 .Net Framework 4.7,目标平台是 AnyCPU。RID 是 win10-x64,如果有帮助的话可以查看RID。 每个 Nuget 包都是最新的等等。

有什么想法吗?我在谷歌上搜不到任何信息。


此外,在您的 csproj 文件中,Microsoft.VisualStudio.Web.CodeGeneration.Design 的哪个版本在其中?(希望是 2.0.0) - DavidG
@DavidG 我使用默认配置(services.AddMvc();)时出现了同样的异常。但是我在我的csproj中确保了Microsoft.VisualStudio.Web.CodeGeneration.Design的版本为2.0.0。 - ken2k
嗯,试一下也值得。也许你可以尝试重新安装那个软件包,或者检查它的依赖项以确保它们也是最新的。 - DavidG
@DavidG 是的,值得一试!我也尝试重新安装了该软件包,但还是没有运气 :/ - ken2k
清除了NuGet缓存和bin/obj文件夹吗?同时确保您的.csproj中没有<PlatformTarget>x86</PlatformTarget>(我曾经遇到过这个问题,另一个是错误的<RuntimeIdentifier>)。 - Tseng
显示剩余2条评论
3个回答

6

在我从x86切换到x64时(从core 1.1升级到2.0后),发生了相同的异常。

由于运行时不真正需要 dotnet-aspnet-codegenerator-design,因此我删除了该参考。但是,随后 Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv 组件出现了相同的异常。

幸运的是,这个问题与我没有更改.NET Core Runtime Identifier (RID)有关。它仍然设置为win7-x86,所以我将其更改为win7-x64,Libuv 依赖项就可以加载了。

我希望会有一些修复 dotnet-aspnet-codegenerator-design 的方法,因为这种依赖项可能对于搭建控制器和视图至关重要...

更新:在Github上有一个问题与此相关(https://github.com/aspnet/Scaffolding/issues/601)


我也删除了引用,这是目前唯一可行的解决方法。话说我的项目一直以来都是针对 AnyCPU 的,所以我不确定这个问题从何而来。看起来确实像是一个 bug。 - ken2k

0

有可能是依赖项损坏了。您可以使用 Everything(https://filehippo.com/download_everything/)等工具搜索并找到已损坏的依赖项。极有可能它会在这个文件夹中:(C:\Program Files\dotnet\shared)。一旦找到它,尝试谷歌并重新下载它(很有可能,您会找到一个 nuget),然后替换旧的或损坏版本(请务必备份)。

如果您无法在线找到依赖项的替代品,请将项目发布到一个文件夹中,所有依赖项都会被复制到该文件夹中。如果您发布项目,并运行dotnet PROJECTNAME.dll仍然出现相同的错误,您可能需要对 Visual Studio 进行清洗安装或修复。

希望这能为某些人节省很多时间,因为这个错误可能需要很长时间才能调试出来。


0
我在SmarterASP.NET托管上也遇到了这个错误。虽然我无法尝试所有建议的文件更新,但找到了另一种解决方案,在此之前我尝试编译多个目标却没有成功。最终,当我将目标设置为Portable时,它就开始正常工作了。在Smarter上,它现在作为Framework Dependent Deployment、ASP 2.2 Core和Portable运行得很好。有时候,我发现让Core运行起来就像是要拿出老式的试错技巧一样。总之,你的结果可能会有所不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接