【问题标题】:How to compile code on the fly in asp.net core?如何在 asp.net core 中即时编译代码?
【发布时间】:2017-04-18 08:55:28
【问题描述】:

我使用 Visual Studio 2015 在 asp.net 核心中创建一个应用程序。(.net 核心版本:1.0.1)当我对 cs 文件进行任何更改然后保存文件并刷新浏览器时,我的代码更改未反映在浏览器。那么我怎样才能获得动态的代码反射呢?

project.json

{
  "compilationOptions": {
  "emitEntryPoint": true
},
  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.1",
      "type": "platform"
    },
    "Microsoft.AspNetCore.Diagnostics": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.1",
    "Microsoft.AspNetCore.Razor.Tools": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.AspNetCore.Routing": "1.0.1",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0",
    //"Microsoft.VisualStudio.Web.CodeGenerators.Mvc": "1.0.0-preview2-final",
    //"Microsoft.VisualStudio.Web.CodeGeneration.Tools": "1.0.0-preview2-final",
    "Microsoft.VisualStudio.Web.CodeGenerators.Mvc": {
      "version": "1.0.0-preview2-final",
      "type": "build"
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8"
      ]
    },

    //Database Provider for EF Core
    "Microsoft.EntityFrameworkCore.SqlServer": "1.0.1",
    //EF Core Package Manager Console Tools
    //"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
    //EF Core Funtionality for MSSQL Server
    "Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.1",
    "Microsoft.EntityFrameworkCore.Design": "1.0.0-preview2-final"
  },

  "tools": {
    "BundlerMinifier.Core": "2.0.238",
    "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final",
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final",
    "Microsoft.DotNet.Watcher.Tools": {
      // "version": "1.0.0-preview2-final",
        "version": "1.0.0-*",
      "imports": "portable-net451+win8"
    },

    "Microsoft.EntityFrameworkCore.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8+dnxcore50",
        "portable-net45+win8"
      ]
    },
    "Microsoft.VisualStudio.Web.CodeGeneration.Tools": {
      "version": "1.0.0-preview2-final",
      "imports": [
        "portable-net45+win8"
      ]
    }


  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "debugType": "portable"
  },
  "runtimes": {
    "win10-x64": {},
    "osx.10.10-x64": {},
    "ubuntu.14.04-x64": {}
  },
  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "**/*.cshtml",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "prepublish": [ "bower install", "dotnet bundle" ],
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

【问题讨论】:

  • 我正在使用 Visual Studio Express 使用 asp.net mvc 构建一个 Web 应用程序。我按 CTRL-F5 无需调试即可运行。它构建了我的代码。您可以保存 cshtml 并在不构建的情况下查看差异,但您必须构建才能看到 .cs 文件中的差异
  • 您可以使用dotnet watch run 命令。
  • @MarcinZablocki:你是对的。我们可以使用命令行来做到这一点。但我想要在 Visual Studio 中使用这个功能。
  • 您始终可以使用 Visual Studio 中的内置终端。如第一条评论所述,另一个解决方案是使用 Ctrl+F5 运行您的项目。
  • @MarcinZablocki:请详细说明 Visual Studio 中的内置终端,我没有使用 Ctrl+F5 即时获得代码反射。

标签: asp.net .net asp.net-core asp.net-core-mvc asp.net-core-1.0


【解决方案1】:

真的没有“即时编译代码”这样的东西。

微软提供的唯一方法是在更改文件时重新编译整个项目/程序集。这可以通过dotnet watch run 完成。这是一个监视文件系统更改的工具(做得很差),然后关闭 dotnet 进程并重新运行 dotnet start 以再次启动该进程。

我不得不说这是非常缓慢的,不可能在大型项目中使用。

我的建议是实现你自己的观察者。而是每次都将其构建到不同的目录,因此您只能在成功构建项目后停止当前进程(并开始这个新的成功构建)。您可以使用简单的节点脚本或 python 脚本来做到这一点。

简单的脚本如下所示:

  • 监视目录中 *.cs 文件的更改
  • Watcher 包含一个运行 dotnet build -o /TempDir 的回调
  • 在此过程给出退出代码 0 后(表示成功)
    • 杀死旧进程
    • 运行dotnet run /Tempdir/your.dll 启动新进程

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多