C# Visual Studio 2015中的共享项目和类库之间有什么区别?

C# Visual Studio 2015中的共享项目和类库之间有什么区别?,c#,.net,visual-studio-2015,C#,.net,Visual Studio 2015,我正在研究Visual Studio 2015的新功能,共享项目出现了很多,但我不明白使用类库或可移植类库有什么不同。有人能解释一下吗 编辑:共享项目是Visual Studio 2015中的一项新功能,与可移植类库不同。我理解什么是可移植类库。我想了解的是共享项目与类库的区别。请参阅下面的链接 共享项目和类库的区别在于后者是编译的,重用的单位是程序集 而对于前者,重用的单位是源代码,共享代码被合并到引用共享项目的每个程序集中 当您希望创建针对特定平台但仍有应共享代码的单独程序集时,这可能非常有

我正在研究Visual Studio 2015的新功能,共享项目出现了很多,但我不明白使用类库或可移植类库有什么不同。有人能解释一下吗

编辑:共享项目是Visual Studio 2015中的一项新功能,与可移植类库不同。我理解什么是可移植类库。我想了解的是共享项目与类库的区别。请参阅下面的链接


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

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

当您希望创建针对特定平台但仍有应共享代码的单独程序集时,这可能非常有用

另见:

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


在Visual Studio1的早期版本中,您可以通过添加->现有项,然后选择链接,在项目之间共享源代码。但这有点笨重,每个单独的源文件都必须单独选择。随着支持多个不同平台(iOS、Android等)的发展,他们决定通过添加共享项目的概念,使项目间共享源代码变得更加容易



1这个问题和我的回答(到目前为止)表明,共享项目是Visual Studio 2015中的一项新功能。事实上,他们在

中首次亮相,我从中找到了更多信息

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

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

    控制台、Windows窗体和Windows演示文稿基础。
  • Windows应用商店8.1应用程序和Windows Phone 8.1应用程序
  • Windows Phone 8.0/8.1 Silverlight应用程序
  • 可移植类库
注意:-共享项目和可移植类库(PCL)都允许共享代码、XAML资源和资产,但当然也存在一些差异,可以总结如下

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

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

共享项目
在代码(文件)级别重用,同时考虑文件夹结构和资源

pcl
在装配级别重用

对于我来说,这里的答案中最缺少的是关于PCL中可用功能减少的信息:例如,您的文件操作有限(我在Xamarin跨平台项目中缺少了很多file.IO功能)

更详细地
共享项目
+在针对多个平台(如Xamarin iOS、Android、WinPhone)时可以使用#if
+每个目标项目可用的所有框架功能(尽管必须有条件地编译)
o在编译时集成
-结果组件的大小稍大
-需要Visual Studio 2013更新2或更高版本

pcl
+生成共享程序集
+可用于较旧版本的Visual Studio(2013年之前的更新2)
o动态链接
-lmited功能(它所引用的所有项目的子集)

如果您有选择的话,我建议您选择共享项目,它通常更灵活、更强大。如果您事先知道自己的需求,并且PCL可以满足这些需求,那么您也可以这样做。PCL还通过不允许您编写特定于平台的代码来强制实现更清晰的分离(这可能不是一个很好的选择,一开始就放在共享程序集中)


两者的主要焦点都是当您针对多个平台时,否则您通常只会使用普通的库/dll项目。

简而言之,区别在于

1) PCL不会像SharedProject那样完全访问.NET Framework

2) #ifdef用于平台特定代码-您不能在PCL中编写(#ifdef选项在PCL中不可用,因为它是单独编译的,作为自己的DLL,因此在编译时(计算#ifdef时)它不知道它将是哪个平台的一部分。)您可以在哪里作为共享项目

3) 特定于平台的代码是在PCL中使用控制反转实现的,在共享项目中使用#ifdef语句也可以实现同样的效果

在下面的链接中可以找到一篇说明PCL和共享项目之间差异的优秀文章

类库