簡體   English   中英

在沒有 .NET Core SDK 的情況下將 ASP.NET Core MVC 作為控制台應用程序項目運行

[英]Running ASP.NET Core MVC as a Console Application Project without .NET Core SDK

問題背景

我正在創建一個工具,tha 生成 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" />

並使用 Kestrel 自托管應用程序:

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

        host.Run();
    }
}

我添加了帶有視圖的控制器。 當我發出請求時,控制器被命中,但無法在運行時編譯視圖: 在此處輸入圖片說明

這種行為是否與我使用的是Console Application而不是ASP.NET Core Web Application的事實有關? 是否可以將功能齊全的 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);
                                                                   };
                                 });
    }

這似乎使 Razor 呈現我的觀點。 但我不確定它是否可以被接受為解決方案。

目前,無法使用 MSBuild 構建 .NET Core 應用程序,但可以創建控制台應用程序(不是 .NET Core)並使用 NuGet 添加相同的包(以下分步說明)。

根據這個路線圖,在不久的將來這將是可能的。

來自上面鏈接的信息:

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

這將是第一個小更新,主要集中在用 .csproj/MSBuild 替換 .xproj/project.json。 項目格式更新應該是自動的。 只需打開 1.0 項目即可將其更新為新的項目格式。 運行時和庫中還將有新功能和改進。*

編輯(使用 Kestrel 創建控制台應用程序的步驟):

我創建了一個控制台應用程序(不是 .NET Core 控制台),並且能夠使用簡單的 MVC API 運行 Kestrel。

這是我所做的:

  • 我看到了我在現有 .NET Core 應用程序中使用的依賴項,然后將它們添加為 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"
  • 修改了main方法:

     static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); }
  • 創建了一個 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?}"); }); } }
  • 添加一個類作為我的 MVC 控制器:

     [Route("api/[controller]")] public class ValuesController : Controller { // GET api/values [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }
  • 我不得不手動將libuv.dll文件復制到 bin 文件夾中,因為我遇到了錯誤。

通過這些步驟,我能夠運行我的控制台應用程序。 在下圖中,您可以看到我的項目結構和 Kestrel 正在運行:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM