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渲染了我的观点.但我不确定它是否可以被接受作为解决方案.
现在,使用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文件夹,因为我收到了一个错误.
通过这些步骤,我可以运行我的控制台应用程序.在下图中,您可以看到我的项目结构和运行的红隼:
| 归档时间: |
|
| 查看次数: |
9560 次 |
| 最近记录: |