在Visual Studio 2015中,共享项目和类库有什么区别?

284
我正在查看Visual Studio 2015的新功能,其中“共享项目”出现了很多次,但我不明白它与使用类库或可移植类库有何不同。有人能解释一下吗?
编辑:共享项目是Visual Studio 2015中的一个新功能,与可移植类库不同。我理解什么是可移植类库。我想要了解的是共享项目与类库之间的区别。请参见下面的链接。

http://www.c-sharpcorner.com/UploadFile/7ca517/shared-project-an-impressive-features-of-visual-studio-201/


6个回答

282

共享项目和类库的区别在于后者是编译的,重用的单元是程序集。

而前者的重用单元是源代码,共享代码被合并到引用共享项目的每个程序集中。

当您想要创建针对特定平台的单独程序集但仍具有应该共享的代码时,这将非常有用。

另请参见此处

共享项目引用显示在“解决方案资源管理器”中的“引用”节点下,但共享项目中的代码和资产被视为链接到主项目中的文件。


Visual Studio 2012及之前版本, 您可以通过添加->现有项目,并选择链接来在项目之间共享源代码。但这种方式有点笨拙,每个单独的源文件都必须单独选择。随着支持多个不同平台(iOS、Android等)的转变,它们决定通过添加共享项目的概念来更容易地在项目之间共享资源。

2
假设有两个引用同一共享项目的项目。如果其中一个项目添加对另一个项目的引用,会出现重复类型声明错误吗? - Asad Saeeduddin
4
@Asad - 我没有检查,但我认为不会有问题。你可以拥有两个不同的类型,具有相同的名称,并声明在同一命名空间内但存在于不同程序集中。这本质上不是一个错误。 - Damien_The_Unbeliever
我在2017年与OP有一模一样的问题,但现在我们已经有了.NET Standard 2.0。难道共享项目现在已经过时了吗?如果您今天要创建全新的Web应用程序或UWP应用程序,该怎么做呢? - JP Hellemons
1
@JPHellemons - .NET Standard 很好,但如果由于某些原因需要超出其范围(例如,如果只有在特定平台上才能使用某些功能),那么共享项目仍然是一个不错的选择。 - Damien_The_Unbeliever
1
我们可以使用共享项目来共享JavaScript文件。那么在bundleConfig中如何使用呢? - Leth
显示剩余5条评论

40

我从这个博客中找到了更多信息。

  • 在类库中,当代码被编译时,会为每个库生成程序集(dlls)。但是对于共享项目,它不包含任何标头信息,因此当您有共享项目引用时,它将作为父应用程序的一部分进行编译。不会创建单独的dlls。
  • 在类库中,只允许编写C#代码,而共享项目可以有任何东西,如C#代码文件、XAML文件或JavaScript文件等。

14
一个类库可以有 .xaml 文件(用户控件)。 - default

22

简而言之,它们的区别在于:

1)PCL无法完全访问.NET Framework,而SharedProject可以。

2)用于平台特定代码的#ifdef选项在PCL中不可用,因为它被单独编译为自己的DLL,所以在编译时(评估#ifdef时)它不知道它将成为哪个平台的一部分。而在共享项目中可以使用。

3)使用Inversion Of Control可以在PCL中实现特定于平台的代码,而使用#ifdef语句可以在共享项目中实现相同的功能。

以下链接有一篇很好地阐述了PCL与Shared Project之间的区别的文章:

http://hotkrossbits.com/2015/05/03/xamarin-forms-pcl-vs-shared-project/


22

像其他人已经写过的一样,简而言之:

共享项目
在代码(文件)级别上进行重用,允许使用文件夹结构和资源

pcl
在程序集级别上进行重用

对我来说这里大多数答案缺少的信息是有关 PCL 中可用功能减少的信息:例如,在 Xamarin 跨平台项目中,您的文件操作受到限制(我错过了很多 File.IO 功能)。

更详细地说
共享项目:
+ 可以在针对多个平台时使用 #if(例如 Xamarin iOS、Android、WinPhone)
+ 每个目标项目都可用所有框架功能(但必须有条件编译)
o 在编译时集成
- 生成的程序集稍微大一些
- 需要 Visual Studio 2013 Update 2 或更高版本

pcl:
+ 生成共享程序集
+ 可用于较旧版本的 Visual Studio(2013 Update 2 之前的版本)
o 动态链接
- 功能有限(是被引用的所有项目的子集)

如果可以选择,我会建议选择共享项目,因为它通常更灵活、更强大。如果您事先知道自己的要求,并且 PCL 可以满足这些要求,您也可以选择该路线。PCL 还通过不允许编写特定于平台的代码(可能首先不能放入共享程序集)来强制实现更清晰的分离。

两者的主要重点是针对多个平台进行目标设置,否则通常会使用普通的库/ DLL 项目。


21

类库是共享的编译代码。

共享项目是共享的源代码。


做到了,唯一的显著区别。想要理解“共享项目”类型,几乎可以更容易地回答这个问题:一个WPF项目和一个WinForms项目都需要10个类,如何在不重复代码或二进制文件的情况下实现 - 共享项目几乎是唯一的方法。 - PandaWood

12

来自书籍VS 2015 succintly

共享项目允许在多个项目类型之间共享代码、资源和资产。更具体地说,以下项目类型可以引用和使用共享项目:

  • 控制台、Windows 窗体和 Windows 展示基础。
  • Windows Store 8.1 应用程序和 Windows Phone 8.1 应用程序。
  • Windows Phone 8.0/8.1 Silverlight 应用程序。
  • 可移植类库。

注意:- 共享项目和可移植类库 (PCL) 都允许共享代码、XAML 资源和资产,但它们之间有一些差异,可以总结如下:

  • 一个共享项目不会生成可重用的程序集,因此只能从解决方案内使用它。
  • 共享项目支持平台特定的代码,因为它支持环境变量,例如 WINDOWS_PHONE_APP 和 WINDOWS_APP,您可以使用它们来检测您的代码正在运行的平台。
  • 最后,共享项目不能依赖于第三方库。
  • 相比之下,一个 PCL 生成一个可重用的 .dll 库,并且可以依赖于第三方库,但它不支持平台环境变量。

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