【问题标题】:Can the new ASP.NET 5 (ASP.NET MVC 6) project type target regular .NET?新的 ASP.NET 5 (ASP.NET MVC 6) 项目类型能否以常规 .NET 为目标?
【发布时间】:2015-03-21 18:55:11
【问题描述】:

新的 ASP.NET 5 (vNext) 做了一些很棒的事情,例如集成 Bower、Grunt 和其他客户端 Web 开发工具 into the project

但是,我开始意识到(在制作并完成了许多此类项目之后),所有这些似乎都仅限于可以针对新的“云”或“跨平台”(KRE-CLR) 的项目仅堆栈,而不是常规的 .NET 堆栈。与定位这个新堆栈一样好,这严重限制了此时可以定位的内容(基本上您现在引用的任何 dll / 项目都不是 ASP.NET 5 类库,所以它不能被引用,所以你不能依赖这个?)。

我错过了什么吗?新的 ASP.NET 5 (ASP.NET MVC 6) 项目类型可以针对常规 .NET 吗?

如果答案是否定的,即使现在不可能,团队是否计划至少将其中一些客户端功能(bower、grunt 等)添加到“常规”ASP.NET (MVC 5 ) 未来的项目?

【问题讨论】:

  • 您关心的是什么? ASP.NET 仍将拥有 .NET 框架的全部功能。只是 .NET 框架的打包方式与现在略有不同。 “常规 .NET”有什么新设置没有的?
  • 我担心应该添加这些客户端框架(grunt、gulp、bower),以便在针对完整 .NET 框架的代码中也能正常工作。此外,他们为什么不呢?事实上,也许这是可能的,所以我的问题。
  • “'常规 .NET' 有什么新设置没有的?”它能够引用定期编译的类库(dll)。我突然意识到我不能引用任何本身还不是“ASP.NET 5 类库”的 dll 或项目。例如,我有一个针对 EF 的大型代码库,但 EF vnext 现在是超级 alpha 版本,我需要大量的工作来转换基于它的所有代码(包括其他基于 EF 的库,如 EF.Extended, EF.MappingApi、EF.BulkInsert 等)。
  • 从外观上看,如果你把它放在一个 NuGet 包中,你可以在 vNext 中使用一个普通的 DLL 程序集:forums.asp.net/t/… 有帮助吗?
  • 感谢 JLRishe!这实际上教会了我很多。不幸的是,我这样做了,将一个简单但定期编译的 .NET 程序集打包到本地 nuget 提要位置。所有这些都很好,而且进口也很好。但是,一旦导入,引用中的那个 dll 会显示一个黄色警告符号,并且网站会编译但在启动时会抛出错误。它显然不起作用,实际上我不知道它是怎么做到的,因为源框架不是完整的 .NET。

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


【解决方案1】:

根据我使用最新版 Visual Studio CTP 5 的经验,以下几点需要考虑:

  1. 在 CTP 5 中,它现在允许您添加对常规类库的引用。
  2. 在 ASP.net vNext 他们针对不同的框架来支持跨平台,这是新支持的 例如,如果您只在 frameworks (project.json) 中选择 aspnet50 并且运行时是 CLR,那么它将使用完整的 .NET Framework,因此您可以使用几乎所有功能,例如 ASP.NET MVC 5。 如果您想使用 aspnetcore50,那么可能会有很多功能不可用,甚至很多功能正在开发中。
  3. 如果您已经构建了自己的类库并且想要添加对它的引用,那么在 VS 2015 预览版和 CTP5 中,您必须发布 NUGET 包,然后使用该包来引用该 DLL。
  4. 如果您想使用常规的 .NET 程序集(例如 System.DirectoryService),请确保您在 project.json 中只有一个框架。

更新

我假设您使用的是 Visual Studio 2015 CTP 5。

这是我的 project.json 的副本

{
    /* Click to learn more about project.json  http://go.microsoft.com/fwlink/?LinkID=517074 */
    "webroot": "wwwroot",
    "version": "1.0.0-*",
    "dependencies": {
        "EntityFramework.SqlServer": "7.0.0-beta2",
        "EntityFramework.Commands": "7.0.0-beta2",
        "Microsoft.AspNet.Mvc": "6.0.0-beta2",
        /* "Microsoft.AspNet.Mvc.WebApiCompatShim": "6.0.0-beta2", */
        "Microsoft.AspNet.Diagnostics": "1.0.0-beta2",
        "Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta2",
        "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta2",
        "Microsoft.AspNet.Security.Cookies": "1.0.0-beta2",
        "Microsoft.AspNet.Server.IIS": "1.0.0-beta2",
        "Microsoft.AspNet.Server.WebListener": "1.0.0-beta2",
        "Microsoft.AspNet.StaticFiles": "1.0.0-beta2",
        "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta2",
        "Microsoft.Framework.CodeGenerators.Mvc": "1.0.0-beta2",
        "Microsoft.Framework.Logging": "1.0.0-beta2",
        "Microsoft.Framework.Logging.Console": "1.0.0-beta2",
        "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta1"
    },
    "commands": {
        /* Change the port number when you are self hosting this application */
        "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5000",
        "gen": "Microsoft.Framework.CodeGeneration",
        "ef":  "EntityFramework.Commands"
    },
    **"frameworks": {
        "aspnet50": {
            "dependencies": {
            "MyCoolLibrary": "1.0.0-*"
            } }

    },**
    "exclude": [
        "wwwroot",
        "node_modules",
        "bower_components"
    ],
    "packExclude": [
        "node_modules",
        "bower_components",
        "**.kproj",
        "**.user",
        "**.vspscc"
    ],
    "scripts": {
        "postrestore": [ "npm install" ],
        "prepare": [ "grunt bower:install" ]
    }
}

我在 MyCoolLibrary 中的自定义类库,它被添加到框架依赖项而不是依赖项中。我还使用 .NET Framework 4.5 构建了我的库。 (不是 4.5.3)所以它也支持旧版本。

如果您使用的是 Visual Studio 2015 Preview,那么上述内容也可以使用。

【讨论】:

  • 这些是非常有用的评论!第 2 点有助于认识到可以简单地删除 aspnetcore50。但是,当我右键单击项目 - 属性时,它会显示一个带有标题的下拉框:“目标 KRE 版本”。并且这两个选项都是 KRE(KRE-CLR-x86 和 KRE-CLR-amd64)。那么我如何指定我想要的目标不是这个“KRE”云版本,而是常规 CLR? (或者也许 KRE 是别的东西?)所以:删除 aspnetcore50 后,我仍然无法引用常规 dll,并将该 dll 引用为我制作的 nuget 包,它可以工作,但随后仍显示黄色符号(显然是错误)。
  • 您尝试添加和共享哪个 dll 有问题的图像?
  • DLL 是一个非常简单的项目/程序集,除了基本的 C# 东西之外,它的唯一依赖项是 System.Xml 和 System.Linq.Xml。关键是,这是一个非常基本的程序集,它是一个很好的测试用例,如果 IT 不起作用,则不应该。我把它做成了一个本地 nuget 包,并在本地 nuget 提要中引用它(在进行更改后,我仍然无法添加简单的 ref),这一切正常,它安装在 nuget 和所有内容中,但随后在引用中添加程序集上有一个黄色的小警告标志(以及根 ASP.NET 5.0 引用节点上的相同黄色标志)。
  • 那么我还需要做些什么来让常规的 .NET 工作正常工作吗?项目属性几乎没有任何可用选项,但我看不到任何可行的方法。通过 project.json,我看不到关于更改框架的另一个选项......
  • 黄色标志是没有找到参考资料。这就是为什么我问如果你共享你的 project.json 和黄色符号的 snap 并扩展,那么我可以提供帮助,因为我已经测试添加现有的 .NET 程序集,你必须将它们添加到 project.json 框架下的 depencies 部分中。
【解决方案2】:

a new post by Scott Guthrie 中,他似乎确认 ASP.NET 5 绝对应该与完整的 .NET 框架一起使用,事实上,甚至说:

“您现有的应用程序和库将在此 [完整的 .NET] 运行时无需修改即可运行。”

这是完整的引文:

ASP.NET 5 可与两个运行时环境一起使用,从而在托管应用程序时为您提供更大的灵活性。两个运行时选择是:([a] .NET Core ... [b] .NET Framework – .NET Core 的 API 目前比完整的 .NET Framework 更受限制,因此您可能需要修改现有应用程序以面向 .NET Core。如果您不想更新您的应用程序,您可以改为运行 ASP。 NET 5 应用程序在完整的 .NET Framework(版本 4.5.2 及更高版本)上。执行此操作时,您可以访问完整的 .NET Framework API 集。您现有的应用程序和库将在此运行时上运行而无需修改。

虽然我很高兴听到这个消息,但这个问题和其他发帖人讨论的问题使得这个目标似乎与当前的现实不符。简单来说,我们不仅需要能够以完整的 .NET 为目标,还需要简单地引用当前的 .NET dll/程序集。目前,似乎唯一有效的程序集是针对 .NET Core 构建的程序集。

那么这个难题的答案呢?我相信答案是:它来了。这个根据the new Visual Studio 2015 CTP 6 release notes

系统引用又回来了

您现在可以使用“添加引用”对话框轻松添加对系统程序集的引用,这将对您的 project.json 文件进行适当的修改... 我们也在努力支持为未来的预览版本添加对用户程序集的引用

(来自那篇文章的图片)

那么,这是个好消息!这也证明了,根据这些帖子,这些确实是迄今为止的缺点(并且目前仍然存在于用户程序集)。

【讨论】:

  • 我们在 2015 年 11 月,我们仍然无法将自己的类库项目添加到 MVC 6 项目中。或者更确切地说,您可以尝试,但很可能会出现参考错误。
  • 是的,令人失望。至少这个月它会在这里进行 RC,而本周三的会议可能对我们有一些好处。也许这将在下个月左右得到解决。
  • 这个问题解决了吗?我需要引用一个调用旧 Web 服务(不是 svc,而是更旧)的 dll,但在 RC1 上还没有找到任何东西。以为我会使用 RC1 而不是旧的 Web API,所以我不必在几个月内重做项目……不确定这是否可行。
  • @Jon49 请告诉我们您的发现。我很想知道现在什么是有效的,什么是无效的,但我目前没有参与新的项目类型。
  • 我问了一个新问题。我想如果您不引用 dnxCore50,它就可以正常工作。查看问题下的第一条评论:stackoverflow.com/q/34661624/632495
【解决方案3】:

客户端功能未连接到 dll。它们可以从 Nuget 包添加到旧的 ASP .NET 项目中。

【讨论】:

  • “团队是否计划在未来至少将其中一些客户端功能(bower、grunt 等)添加到‘常规’ASP.NET (MVC 5) 项目中?” - 常规的 asp .net 项目可以通过 nuget 包添加这些客户端功能。默认项目模板不可用。
  • 谢谢克莱夫。虽然我认为您的第一句话误读了我所说的内容(“客户端 [框架] 功能未连接到 dll。” - 我从未说过这一点),但您确实提到了一些非常相关的事情。当我在 nuget 中搜索“bower”或“grunt”时(即使在 VS 2014 中),我确实看到了这些的 nuget 包!但是,这些与新的 ASP.NET(在 VStudio 2015 中)中可用的内容完全相同吗?谢谢。
【解决方案4】:

我不确定这是否能解决您的问题,但您可以在新项目中定位常规 CLR。​​

在您的 project.json 文件中注释掉 aspnet50 和 aspnetcore50 并改用 net45:

{    
    "version": "1.0.0-*",
    "dependencies": {
    },

    "frameworks": {
        "net45": { 
            "dependencies": { }
        }
        /* 
        "aspnet50" : { },
        "aspnetcore50": { } */
    }
}

【讨论】:

  • 非常有趣!但是,我只是按照您所说的做了,突然根本没有识别出任何 ASP.NET 类型(IActionResult、Controller、HttpPost,什么都没有)。但它确实发生了变化,因此在引用下根节点现在称为 .NET Framework 4.5
  • 如何在这些项目中更改目标框架? IE。 4.5.3 对面 4.6 等等?也许这是一个促成问题? (我不是指其他引用的项目
  • 需要明确的是,现在这些都不被识别:使用 Microsoft.AspNet.Identity;使用 Microsoft.AspNet.Mvc;根本没有 Microsoft.AspNet(即,AspNet 命名空间部分在智能感知中甚至不可用,红色波浪线“类型或命名空间 'AspNet' 不存在于命名空间 'Microsoft' 中(您是否缺少程序集引用?)但是我所做的只是将“aspnet50”更改为“net45”,就像你说的那样。
  • @NicholasPetersen 他们没有被识别,因为他们自己没有针对 net45。我不确定在这个阶段你想要做的事情是否可行。在标准 CLR 中,您将引用 System.Web.Mvc 来获取所有 MVC 内容。在上面的配置文件中,你会在 net45 依赖项下引用,但这不起作用。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2018-07-30
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
相关资源
最近更新 更多