在没有.NET Core SDK的情况下将ASP.NET Core MVC作为控制台应用程序项目运行

361*_*615 5 c# msbuild asp.net-mvc asp.net-core

问题背景

我正在创建一个工具,可以生成MVC解决方案(*.sln)和构建(使用msbuild),以便可以部署它们.工具需要.NET Framework 4.5.2.

现在我想生成ASP.NET Core MVC应用程序.这样的应用程序可以在4.5.X下运行,但是我不确定msbuild是否可以处理project.json(所以我使用的是packages.config)并且我无法安装.NET Core,因为每个教程都表明是开发ASP.NET的先决条件核心.目前我计划在Windows上部署生成的应用程序.

问题:

因此,我创建了一个简单的控制台应用程序而不是.NET Core项目: 在此输入图像描述 在那里我安装了所有需要的包,比如:

  <package id="Microsoft.AspNetCore.Mvc" version="1.0.1" targetFramework="net452" />
Run Code Online (Sandbox Code Playgroud)

并使用Kestrel SelfHosted应用程序:

    public class Program {
    static void Main() {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了一个带有View的Controller.当我执行请求时,控制器被命中,但View无法在运行时编译: 在此输入图像描述

这种行为是否与我使用控制台应用程序而不是ASP.NET核心Web应用程序有关?是否可以创建一个功能齐全的MVC应用程序作为一个简单的控制台应用程序?

更新:

我想我已经找到了一个灵感来自阅读github 问题的解决方法:

 public void ConfigureServices(IServiceCollection services) {
        services.AddMvc()
                .AddRazorOptions(options => {
                                     var previous = options.CompilationCallback;
                                     options.CompilationCallback = context => {
                                                                       previous?.Invoke(context);
                                                                       var refs = AppDomain.CurrentDomain.GetAssemblies()
                                                                                           .Where(x => !x.IsDynamic)
                                                                                           .Select(x => MetadataReference.CreateFromFile(x.Location))
                                                                                           .ToList();
                                                                       context.Compilation = context.Compilation.AddReferences(refs);
                                                                   };
                                 });
    }
Run Code Online (Sandbox Code Playgroud)

这似乎让Razor渲染了我的观点.但我不确定它是否可以被接受作为解决方案.

Fab*_*och 6

现在,使用MSBuild构建.NET Core应用程序是不可能的.但是可以创建一个Console应用程序(不是.Net Core)并使用Nuget添加相同的包(逐步说明).

根据这个路线图,有可能在不久的将来.

来自以上链接的信息:

2016年第四季度/ 2017年第一季度

这将是第一次小更新,主要侧重于用.csproj/MSBuild替换.xproj/project.json.项目格式更新应该是自动的.只需打开一个1.0项目就会将其更新为新的项目格式.运行时和库中还将有新的功能和改进.*

编辑(使用红隼创建控制台应用程序的步骤):

我创建了一个控制台应用程序(不是.NET Core控制台),我能够使用简单的MVC API运行kestrel.

这是我做的:

  • 我在现有的.net核心应用程序中看到了我使用的依赖项,然后,我将它们添加为nuget引用:

    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0"
    
    Run Code Online (Sandbox Code Playgroud)
  • 修改主要方法:

    static void Main(string[] args) {
      var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();
      host.Run();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 创建了一个Startup.cs(使用问题中提供的解决方法更新):

      public class Startup {
        public Startup(IHostingEnvironment env) {
          var builder = new ConfigurationBuilder()
              .SetBasePath(env.ContentRootPath)
              .AddEnvironmentVariables();
          Configuration = builder.Build();
        }
    
        private IHostingEnvironment CurrentEnvironment { get; set; }
        private IConfigurationRoot Configuration { get; }
    
        public void ConfigureServices(IServiceCollection services) {
                services.AddMvc().AddRazorOptions(options => {
                 var previous = options.CompilationCallback;
                 options.CompilationCallback = context => {
                   previous?.Invoke(context);
                   var refs = AppDomain.CurrentDomain.GetAssemblies()
                          .Where(x => !x.IsDynamic)
                          .Select(x => MetadataReference.CreateFromFile(x.Location))
                          .ToList();
                 context.Compilation = context.Compilation.AddReferences(refs);
                };
              });
        }
    
        public void Configure(IApplicationBuilder app) {
          app.UseStaticFiles();
    
          app.UseMvc(routes => {
            routes.MapRoute(
              name: "default",
              template: "{controller=Home}/{action=Index}/{id?}");
          });
        }
      }
    
    Run Code Online (Sandbox Code Playgroud)
  • 添加一个类作为我的MVC控制器:

      [Route("api/[controller]")]
      public class ValuesController : Controller {
    
        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get() {
          return new string[] { "value1", "value2" };
        }
    
    Run Code Online (Sandbox Code Playgroud)
  • 我不得不将mannualy复制libuv.dll到bin文件夹,因为我收到了一个错误.

通过这些步骤,我可以运行我的控制台应用程序.在下图中,您可以看到我的项目结构和运行的红隼:

在此输入图像描述