C# VS2017的.net Core1.0项目在版本升级为2.0后找不到程序集的处理办法


最近不小心升级了VS2017,然后原来的.net web core1.0的项目是引用了DataBaseLib的程序集,如图  ,升级之后安装了2.0的框架,发现项目就报错了,,这个是还是之后报的错误,第一个错误是Unable to find the library 'DataBase.dll',也就是找不到所引用的程序集的位置。借助同事以及stackoverflow等问答网站,整理的解决办法如下:

修改startup.cs中的代码文件:

原来的代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Threading.Tasks;
 5 using Microsoft.AspNetCore.Builder;
 6 using Microsoft.AspNetCore.Hosting;
 7 using Microsoft.Extensions.Configuration;
 8 using Microsoft.Extensions.DependencyInjection;
 9 using Microsoft.Extensions.Logging;
10 
11 namespace OneStop
12 {
13     public class Startup
14     {
15         public Startup(IHostingEnvironment env)
16         {
17             var builder = new ConfigurationBuilder()
18                 .SetBasePath(env.ContentRootPath)
19                 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
20                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
21                 .AddEnvironmentVariables();
22             Configuration = builder.Build();
23         }
24 
25         public IConfigurationRoot Configuration { get; }
26 
27         // This method gets called by the runtime. Use this method to add services to the container.
28         public void ConfigureServices(IServiceCollection services)
29         {
30             // Add framework services.
31             services.AddMvc();
32         }
33 
34         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
35         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
36         {
37             loggerFactory.AddConsole(Configuration.GetSection("Logging"));
38             loggerFactory.AddDebug();
39 
40             if (env.IsDevelopment())
41             {
42                 app.UseDeveloperExceptionPage();
43                 app.UseBrowserLink();
44             }
45             else
46             {
47                 app.UseExceptionHandler("/Home/Error");
48             }
49 
50             app.UseStaticFiles();
51 
52             app.UseMvc(routes =>
53             {
54                 routes.MapRoute(
55                     name: "default",
56                     template: "{controller=Home}/{action=Index}/{id?}");
57             });
58         }
59     }
60 }

处理之后的代码:

  1 using DataBaseLib;
  2 using Microsoft.AspNetCore.Builder;
  3 using Microsoft.AspNetCore.Hosting;
  4 using Microsoft.AspNetCore.Http;
  5 using Microsoft.AspNetCore.Http.Features;
  6 using Microsoft.AspNetCore.Mvc;
  7 using Microsoft.DotNet.PlatformAbstractions;
  8 using Microsoft.Extensions.Configuration;
  9 using Microsoft.Extensions.DependencyInjection;
 10 using Microsoft.Extensions.DependencyModel;
 11 using Microsoft.Extensions.DependencyModel.Resolution;
 12 using Microsoft.Extensions.Logging;
 13 using Newtonsoft.Json;
 14 using Newtonsoft.Json.Serialization;
 15 using System;
 16 using System.Collections.Generic;
 17 using System.IO;
 18 using System.Reflection;
 19 
 20 namespace Assemble
 21 {
 22     public class Startup
 23     {
 24         public Startup(IHostingEnvironment env)
 25         {
 26             var builder = new ConfigurationBuilder()
 27                 .SetBasePath(env.ContentRootPath)
 28                 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
 29                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
 30                 .AddEnvironmentVariables();
 31             Configuration = builder.Build();
 32         }
 33 
 34         public IConfigurationRoot Configuration { get; }
 35 
 36         // This method gets called by the runtime. Use this method to add services to the container.
 37         public void ConfigureServices(IServiceCollection services)
 38         {
 39 
 40 
 41             Initialize.ConfigureServices(services);
 42             // Add framework services.
 43 
 44             var mvcBuilder = services.AddMvc();
 45             new MvcConfiguration().ConfigureMvc(mvcBuilder);
 46 
 47         }
 48 
 49         public class MvcConfiguration : IDesignTimeMvcBuilderConfiguration
 50         {
 51             private class DirectReferenceAssemblyResolver : ICompilationAssemblyResolver
 52             {
 53                 public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
 54                 {
 55                     if (!string.Equals(library.Type, "reference", StringComparison.OrdinalIgnoreCase))
 56                     {
 57                         return false;
 58                     }
 59 
 60                     var paths = new List<string>();
 61 
 62                     foreach (var assembly in library.Assemblies)
 63                     {
 64                         var path = Path.Combine(ApplicationEnvironment.ApplicationBasePath, assembly);
 65 
 66                         if (!File.Exists(path))
 67                         {
 68                             return false;
 69                         }
 70 
 71                         paths.Add(path);
 72                     }
 73 
 74                     assemblies.AddRange(paths);
 75 
 76                     return true;
 77                 }
 78             }
 79 
 80             public void ConfigureMvc(IMvcBuilder builder)
 81             {
 82                 // .NET Core SDK v1 does not pick up reference assemblies so
 83                 // they have to be added for Razor manually. Resolved for
 84                 // SDK v2 by https://github.com/dotnet/sdk/pull/876 OR SO WE THOUGHT
 85                 /*builder.AddRazorOptions(razor =>
 86                 {
 87                 razor.AdditionalCompilationReferences.Add(
 88                 MetadataReference.CreateFromFile(
 89                 typeof(PdfHttpHandler).Assembly.Location));
 90                 });*/
 91 
 92                 // .NET Core SDK v2 does not resolve reference assemblies‘ paths
 93                 // at all, so we have to hack around with reflection
 94                 typeof(CompilationLibrary)
 95                 .GetTypeInfo()
 96                 .GetDeclaredField("k__BackingField")
 97                 .SetValue(null, new CompositeCompilationAssemblyResolver(new ICompilationAssemblyResolver[]
 98                 {
 99                     new DirectReferenceAssemblyResolver(),
100                     new AppBaseCompilationAssemblyResolver(),
101                     new ReferenceAssemblyPathResolver(),
102                     new PackageCompilationAssemblyResolver(),
103                 }));
104             }
105         }
106 
107         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
108         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
109         {
110             loggerFactory.AddConsole(Configuration.GetSection("Logging"));
111             loggerFactory.AddDebug();
112 
113             if (env.IsDevelopment())
114             {
115                 app.UseDeveloperExceptionPage();
116                 app.UseBrowserLink();
117             }
118             else
119             {
120                 app.UseExceptionHandler("/Home/Error");
121             }
122 
123             app.UseStaticFiles();
124 
125             app.UseMvc(routes =>
126             {
127                 routes.MapRoute(
128                     name: "default",
129                     template: "{controller=Solution}/{action=Index}/{id?}");
130             });
131         }
132     }
133 
134 }

希望能对大家有所帮助!