【问题标题】:What is the difference between a Shared Project and a Class Library in Visual Studio 2015?Visual Studio 2015 中的共享项目和类库有什么区别?
【发布时间】:2015-08-18 12:40:48
【问题描述】:

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

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

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

【问题讨论】:

标签: c# .net visual-studio-2015


【解决方案1】:

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

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

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

另见here

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


在以前版本的 Visual Studio1 中,您可以通过 Add -> Existing Item 然后选择 Link 在项目之间共享源代码。但这有点笨拙,必须单独选择每个单独的源文件。随着支持多个不同平台(iOS、Android 等)的转变,他们决定通过添加共享项目的概念来更轻松地在项目之间共享源代码。


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

【讨论】:

  • 假设两个项目引用同一个共享项目。如果其中一个添加了对另一个的引用,您会收到重复的类型声明错误吗?
  • @Asad - 我没有检查过,但我希望不会。您可以有两种不同的类型,它们具有相同的名称,并在相同的命名空间中声明,但存在于不同的程序集中。这本身并不是一个错误。
  • 我在 2017 年遇到了与 OP 完全相同的问题,但因为我们现在有 .net standard 2.0。共享项目现在不是已经过时了吗?如果您今天要创建一个全新的 web 应用或 uwp 应用?
  • @JPHellemons - .net 标准很好 - 但如果您出于任何原因需要超出该标准(例如,如果有仅在 特定 平台上可用的功能),那么共享项目仍然是一种不错的方法。
  • 我们说通过共享项目我们可以共享 Javascript 文件。我们如何在 bundleConfig 中使用它?
【解决方案2】:

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

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

【讨论】:

  • 类库也可以有 .xaml(用户控件)
【解决方案3】:

短期差异是

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/

【讨论】:

    【解决方案4】:

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

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

    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 项目。

    【讨论】:

      【解决方案5】:

      来自书VS 2015 succintly

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

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

      注意:- 共享项目和可移植类库 (PCL) 都允许共享代码、XAML 资源和资产,但当然存在一些差异,可以总结如下。

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

      【讨论】:

        【解决方案6】:

        类库是共享编译代码。

        共享项目是共享源代码。

        【讨论】:

        • 搞定了,唯一的显着区别。想要理解“共享项目”类型几乎可以更容易地回答这个问题和一个问题:WPF 项目和 WinForms 项目有 10 个它们都需要的类,如何在不复制代码或二进制文件的情况下实现这一点 - 共享项目是实际上是唯一的方法
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多