从 Visual Studio 2015 起, 共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中, 它的主要目的是使多个不同类型的项目之间可以共享代码或资源相比它的前任 PCL(Portable Class Library), 它要灵活得多因为 Shared Project 共享的是代码或资源, 并且不会创建单独的程序集; 而 PCL 则是共享程序集, 需要单独编译, 且会生成单独的程序集
在项目中, 使用 Shared Project 可以帮助我们很容易地解决一些难题本文主要讨论, 在开发过程中, 我们如何使用它以及它具体能够帮助我们解决哪些问题在这之前, 首先来看如何创建与使用 Shared Project
创建与使用
前面说过, Shared Project 是一种项目模板类型, 因此我们可以在现有的解决方案中创建一个新项目, 然后在项目模板列表中选择 Shared Project:
在这个 Shared Project 中我们可以添加所有需要与其它项目共享的代码或资源 (如图片 html 文件 JS 文件等) 另外, 为了保持它与现有项目命名空间一致, 可以在解决方案管理器 " 中右击它, 选择属性, 更改其 Root namespace
接着, 要在那些需要引用它的项目中对其添加引用, 如下:
当引用后, 所有在 Shared Project 中代码和资源能够在这些项目中正常使用
此外, Shared Project 自己无法编译, 我们需要通过编译引用它的项目来生成 exe 或 dll 等程序集并且 Shared Project 本身不会输出为程序集
使用场景
场景一: 输出针对不同 .NET Framework 版本的类库
如果你正在开发一个类库或框架, 而且最终要发布它, 好让别人能够使用, 所以你的类库可能需要满足多个 .NET Framework 版本, 如 2.0/3.5/4.0/4.5 等, 由于更高版本的 Framework 加入了更多的 API 以及更多的语法, 使得在代码编写时更容易, 比如 LINQ 等, 然而低版本却不支持, 因此在类库中的代码就需要对不同的版本有区分
对于这种情况, 借助于 Shared Project 和条件编译符号 (Conditional compilation symbols), 就可以解决上述问题我们可以这样做:
1. 创建一个 Shared Project 项目;
2. 再分别创建多个类库 (Class Library) 项目, 它们的目标框架 (Target framework) 分别指定不同的 Framework 版本;
3. 为每个类库类目设置不同的条件编译符号 (在项目属性中的编译选项卡里设置), 如 NET2_0/NET4_0/NET4_5 等;
4. 然后, 在 Shared Project 中就可以使用这些符号来判断 Framework 版本, 并写出针对不同版本的代码, 例如下面的代码 (注意其中加粗部分):
this.windowChrome = new WindowChrome
{
#if NET4_5
ResizeBorderThickness = SystemParameters.WindowResizeBorderThickness,
#else
ResizeBorderThickness = SystemParameters2.Current.WindowResizeBorderThickness,
#endif
CaptionHeight = 0,
CornerRadius = new CornerRadius(0),
GlassFrameThickness = new Thickness(0),
UseAeroCaptionButtons = false
};
场景二: 输出针对不同 Platform 的类库
如果项目中一个 (或多个) 类库需要同时支持 x86 与 x64 两个不同的 Platform, 以使软件能够在 x86/x64 上都能运行, 这时 Shared Project 也可以派上用场
一个具体的例子是开发 Office 加载项, 如果你的加载项是 COM 类型的, 则需要分别为 32 位与 64 位 Office 提供对应的版本对于 32 位, 程序集的目标平台 (Platform target) 可以是 Any CPU, 但对于 64 位, 则应该是 x64
使用 Shared Project 可以很容易解决这样的问题, 具体做法:
1. 针对加载项创建一个 Shared Project, 将所有代码与资源文件放到这个项目中;
2. 分别创建两个不同的 Class Library, 使它们引用 Shared Project, 不同的是, 这两个项目的目标平台不一样, 一个是 Any CPU, 另一个是 x64;
3. 如果用到了第三方库, 为两个项目添加同样的引用;
4. 除此以外, 你还要修改它们的程序集名称, 使它们的输出的程序集名称有区别且有意义
最后, 需要注意的是, 修改项目属性时, 无论是设置 "条件编译符号", 还是修改 "目标平台", 都要注意它们都与项目的配置 (Debug/Release) 是关联的, 也就是说, 在 Debug 配置中改了, 还要在 Release 配置中改; 对于此, 一个替代的办法是, 从配置下拉列表选择所有配置, 然后再设置符号或目标平台, 则能够对 Debug/Release 都有效
总结
本文主要讨论了 Shared Project 的使用以及它的实际使用场景, 它能够使我们的程序集面向不同 .NET Framework 版本以及不同的 Platform 其实不难看出, 这都是通过修改项目的属性而实现的, 这样一来, 多个项目就可以达到代码相同程序集属性却不同, 从而解决实际对应的问题如果你在开发过程中遇到了类似的问题, 也可以尝试一下使用 Shared Project 来解决
来源: https://www.cnblogs.com/wpinfo/p/shared_project.html