Visual Studio 2015 - Web项目中缺少共享项目引用选项卡

23

我从我们的MSDN订阅中升级到Visual Studio 2015,因为我很兴奋地阅读了有关共享项目的内容...当我们想要重用代码时,不需要再管理21382个依赖项中的NuGet包。

所以我建立了一个带有一些代码的测试共享项目。然后我在.Net 4.6上添加了一个新的空Web应用程序到该项目中。现在我期望进入引用并在引用窗口上看到一个“Shared Projects”选项卡,但是我没有看到。

现在我可以向同一解决方案添加类库并查看该选项卡并添加共享引用。但是我无法将共享项目添加到我的Web应用程序中。

我原本希望能够使用这个概念来与多个MVC项目共享视图。

我是不是漏掉了什么,或者共享项目不兼容Web项目?

我唯一看到的解决方法是针对每个Web应用程序构建两个项目。1个用于代码,1个用于内容。

例如

XYZ.SomeWebSite.Code (Class Library Project Type) -> references Shared Project
XYZ.SomeWebSite (Web Project Type)

然而,如果我选择这种方法,我将无法将视图、文本文件、CSS 文件、JavaScript 文件等推送到 Web 应用程序中。


刚刚发现了一个RTM版本的发布说明:https://www.visualstudio.com/en-us/news/vs2015-vs.aspxWeb项目类型未列为支持的类型,但它来自RTM版本,在发布说明中没有找到任何相关信息。 - Ryan Mann
最近我在生产环境中遇到了一个问题,我认为使用共享项目对IIS网站不利,也许这就是为什么它不存在的原因。我被告知要在一个应用程序池中启动2个站点,但由于我的代码通过共享项目编译到两个站点中,所以它在我身上爆炸了。它们不能同时加载到同一个应用程序池中,因为所有类型都会存在两次... 我成功地说服他们运行2个单独的应用程序池,但这仍然是一个关键时刻,说明为什么这可能是不好的。 - Ryan Mann
正如我之前所说,在我们的情况下,我们不想使用它们来共享代码,而是要使用它们来共享资产(图像、CSS、JavaScript等)。我理解你所说的情况(尽管为什么任何人都会规定两个站点需要在同一个应用程序池中运行有点让人困惑),但因为在某些情况下它不起作用就“把孩子和洗澡水一起扔掉”似乎有点短视。 - Craig W.
抱歉,我上一条评论并不是针对你的,只是为了让其他人参考我的发现,因为这仍然是一个没有得到很多关注的新话题。 - Ryan Mann
1
相关功能请求 - https://developercommunity.visualstudio.com/content/problem/12592/shared-project-tab-in-add-references-dialog-for-as.html - resnyanskiy
显示剩余2条评论
1个回答

44

[临时解决方案]

我通过手动编辑我的Web应用程序的csproj文件来解决了这个问题。

以下是步骤:

  1. 取消加载Web应用程序项目。
  2. 右键单击项目并单击“编辑...”以编辑*.csproj文件。
  3. 现在查找ProjectTypeGuids元素。

    {349C5851-65DF-11DA-9384-00065B846F21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}

第一个guid是ASP.Net MVC 5项目的guid,第二个guid是C#的guid。

你需要做的就是暂时删除第一个guid和分号,只留下C# guid(第二个)。

重新加载项目并添加共享项目。添加完毕后,再次编辑项目文件,将第一个guid和分号放回。

重新加载项目。

共享项目引用仍然存在,并将构建和链接到你的Web应用程序中。

可选地,你可以手动添加共享项目引用,格式如下

<Import Project="..\XYZ.UPlugin\XYZ.Plugin.projitems" Label="Shared" />

1
更新:经测试,在共享项目中创建Assets文件夹时,它不会存在于目标项目的物理磁盘空间中。但是,如果您发布您的站点,它将存在于发布目标中。因此,如果您想在本地测试而不发布,您需要在iis中映射一个虚拟目录到您共享项目中的assets文件夹。 - Ryan Mann
我一直在使用的一个不错的模式是将共享项目的根命名空间更改为其根目录。例如,使用“XYZ”而不是“XYZ.Something”,然后在其中创建一个名为Something的文件夹。将您的代码放在那里,它将默认为“XYZ.Something”命名空间,并将您的代码与根级别资产、asset/css/js文件夹等分开。 - Ryan Mann
1
它将其转换为类库,您添加引用,然后将GUID放回去,它就会恢复为先前的类型。这没有正确的方法,也不受支持。这就是为什么此答案在上方说它是临时的,直到有正确的方法来做到这一点。 - Ryan Mann
2
值得注意的是,尽管它说 <Import Project=... />,但扩展名不是项目文件扩展名 .shproj,而是文件 .projitems。后者文件与项目文件在同一个目录中。 - Manfred
1
值得注意的是:手动添加项目引用也适用于Visual Studio 2017版本15.6.3和新的csproj文件格式(<Project Sdk="Microsoft.NET.Sdk.Web">)。要在VS 2017 ver 15.6.3中创建共享项目,请使用位于模板树根部的名为“共享项目”的模板。 - Manfred
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接