首页 > 其他分享 >.NET: 谈谈共享项目 (Shared Project) 的使用

.NET: 谈谈共享项目 (Shared Project) 的使用

时间:2023-04-09 23:46:00浏览次数:39  
标签:类库 项目 代码 Project Framework Shared NET

从 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 =,
    CornerRadius = new CornerRadius(),
    GlassFrameThickness = new Thickness(),
    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 来解决。

标签:类库,项目,代码,Project,Framework,Shared,NET
From: https://www.cnblogs.com/drew/p/17301469.html

相关文章

  • 在.net项目中添加Husky.Net提交验证
    参考:C#项目添加husky-jesn-博客园(cnblogs.com)官方文档:GettingStarted|Husky.Net(alirezanet.github.io)什么是Husky.net?Husky是一款githook(钩子)工具,让我们在gitcommit之前可以做一些操作,例如,代码格式化,重生生成,提交规范检查等,而Husky.net便是适用于.net平台......
  • .NET Core 离线 生成 Tron 波场私钥和地址笔记
    NuGet引入依赖库PM>Install-PackageTron.Wallet.Net随机生成私钥和对应的地址usingTron.Wallet.Net;namespaceConsoleApp1{internalclassProgram{staticasyncTaskMain(string[]args){vartronECKey=TronECKey.GenerateKey(TronN......
  • internet域名架构的实现
    环境根域:192.168.3.109com服务器:192.168.3.110hxg.com服务器主:192.168.3.108​ 从:192.168.3.107apache主机(www.hxg.com):192.168.3.104转发服务器:192.168.3.101本地DNS服务器:192.168.3.102测试客户端:192.168.3.103配置www.hxg.com主机安装apache$y......
  • ASP.NET Core如何知道一个请求执行了哪些中间件?
    第一步,添加Nuget包引用需要添加两个Nuget包分别是:Microsoft.AspNetCore.MiddlewareAnalysis和Microsoft.Extensions.DiagnosticAdapter,前者是分析记录中间件核心代码实现后者是用来接收日志输出的,由于是用的DiagnosticSource方式记录日志,所以需要使用DiagnosticListener对象的Sub......
  • .NET Core MongoDB数据仓储和工作单元模式封装
    前言     上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NETCore应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一......
  • Drone+.Net 6 实践
    1.[.drone.yml]kind:pipelinetype:dockername:deploymentplatform:os:linuxarch:amd64steps:-name:buildimage:mcr.microsoft.com/dotnet/sdk:6.0volumes:-name:dotnet-buildpath:/mnt/dotnet/appcommands:......
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十)
    Abp(netcore)+easyui+efcore实现仓储管理系统目录abp(netcore)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)abp(netcore)+easyui+efcore实现仓储管理系统——解决方案介绍(二)abp(netcore)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(netcore)+eas......
  • Do you know the bitwise sum sample demonstrated in "Neural Networks and Deep Lea
    Doyouknowthebitwisesumsampledemonstratedin"NeuralNetworksandDeepLearning"byautor MichaelNielsen?Yes,Iamfamiliarwiththebitwisesumexampledemonstratedin"NeuralNetworksandDeepLearning"byMichaelNielsen......
  • 85-云原生操作系统-分层镜像构建并部署业务到Kubernetes集群生产案例
    在生产环境中业务迁移至Kubernetes环境都需要提前规划机房kubernetes集群部署基本步骤:机房环境搭建基础服务搭建系统迁移数据库迁移测试及联调使用服务及版本Pod地址规划端口使用统计业务迁移Nginx+Tomcat+NFS实现动静分离实现步骤:Centos基础环境镜像制作#准备安装包[root@K8s-a......
  • 回顾.NET系列:Framework、Net Core、Net 过往
    目录一、个人最近工作变化二、Framework、NetCore、.NET时过境迁Framework:爱你定格在4.8.NetFoundation:.Net变革大脑重新统一的.NET一、个人最近工作变化我经历了可能很多技术人都会经历的过程,从一名纯粹的技术人员转型成为了一名技术管理我已经不再单纯了,经历了从做好自......