【发布时间】:2015-08-18 12:40:48
【问题描述】:
我正在研究 Visual Studio 2015 的新功能,共享项目出现了很多,但我不明白它与使用类库或可移植类库有何不同。谁能解释一下?
编辑:共享项目是 Visual Studio 2015 中的一项新功能,与可移植类库不同。我了解什么是可移植类库。我想了解的是共享项目与类库有何不同。请参阅下面的链接。
【问题讨论】:
标签: c# .net visual-studio-2015
我正在研究 Visual Studio 2015 的新功能,共享项目出现了很多,但我不明白它与使用类库或可移植类库有何不同。谁能解释一下?
编辑:共享项目是 Visual Studio 2015 中的一项新功能,与可移植类库不同。我了解什么是可移植类库。我想了解的是共享项目与类库有何不同。请参阅下面的链接。
【问题讨论】:
标签: c# .net visual-studio-2015
共享项目和类库的区别在于后者是编译的,复用的单位是程序集。
而对于前者,重用单元是源代码,共享代码被合并到每个引用共享项目的程序集中。
当您想要创建针对特定平台但仍具有应共享的代码的单独程序集时,这可能很有用。
另见here:
共享项目引用显示在解决方案资源管理器的“引用”节点下,但共享项目中的代码和资产被视为链接到主项目的文件。
在以前版本的 Visual Studio1 中,您可以通过 Add -> Existing Item 然后选择 Link 在项目之间共享源代码。但这有点笨拙,必须单独选择每个单独的源文件。随着支持多个不同平台(iOS、Android 等)的转变,他们决定通过添加共享项目的概念来更轻松地在项目之间共享源代码。
1 这个问题和我的回答(到目前为止)表明共享项目是 Visual Studio 2015 中的一个新功能。事实上,它们在Visual Studio 2013 Update 2 中首次亮相
【讨论】:
我从这个blog 中找到了更多信息。
【讨论】:
短期差异是
1) PCL 不会像 SharedProject 那样拥有对 .NET Framework 的完全访问权限。
2) #ifdef 用于平台特定代码 - 您不能在 PCL 中编写(#ifdef 选项在 PCL 中对您不可用,因为它是单独编译的,作为自己的 DLL,所以在编译时(当#ifdef 被评估)它不知道它将成为哪个平台的一部分。)你可以在哪里共享项目。
3) 平台特定代码是使用 PCL 中的控制反转来实现的,而使用 #ifdef 语句可以在共享项目中实现相同的效果。
可以在以下链接中找到一篇说明 PCL 与共享项目之间差异的优秀文章
http://hotkrossbits.com/2015/05/03/xamarin-forms-pcl-vs-shared-project/
【讨论】:
就像其他人已经写过的一样,简而言之:
共享项目
在代码(文件)级别重用,也允许文件夹结构和资源
pcl
在装配级别重用
对我来说,这里的答案中最缺少的是关于 PCL 中可用功能减少的信息:例如,您的文件操作有限(我在 Xamarin 跨平台项目中缺少很多 File.IO 功能) .
更详细
共享项目:
+ 可以在针对多个平台(例如 Xamarin iOS、Android、WinPhone)时使用 #if
+ 每个目标项目都可用的所有框架功能(尽管必须有条件地编译)
o 在编译时集成
- 生成的组件尺寸稍大
- 需要 Visual Studio 2013 Update 2 或更高版本
pcl:
+ 生成共享程序集
+ 可用于旧版本的 Visual Studio(2013 年之前的更新 2)
o 动态链接
- 有限的功能(它被引用的所有项目的子集)
如果你有选择,我会推荐共享项目,它通常更灵活,更强大。如果您提前知道自己的要求并且 PCL 可以满足这些要求,那么您也可能会走这条路。 PCL 还通过不允许您编写特定于平台的代码(首先将其放入共享程序集可能不是一个好的选择)来强制执行更清晰的分离。
两者的主要焦点是当您面向多个平台时,否则您通常只会使用普通的库/dll 项目。
【讨论】:
共享项目允许跨多个项目类型共享代码、资产和资源。更具体地说,以下项目类型可以引用和使用共享项目:
注意:- 共享项目和可移植类库 (PCL) 都允许共享代码、XAML 资源和资产,但当然存在一些差异,可以总结如下。
【讨论】:
类库是共享编译代码。
共享项目是共享源代码。
【讨论】: