ASP.NET Core 6 基础入门系列(5) 项目结构详解之项目文件管理

 

.NET Core/.NET6+平台下创建的ASP.NET Core Web项目与传统 .NET Framework 平台下创建的 ASP.NET Web 项目相比,项目结构、文件管理方式发生了巨大的变化,本文通过讲解两种形式项目的结构与文件管理方式的差异以加深理解 ASP.NET Core Web 项目的轻量、便捷等优势。

.NET Framework 平台下的 ASP.NET Web 项目文件结构

新建一个基于.NET Framework 4.6.1 的ASP.NET MVC Web 项目,结构如下

打开项目所在的目录,找到“DotNetFx461.Web.Study.csproj”项目文件

打开“DotNetFx461.Web.Study.csproj”文件,里面包含下列内容

  • 创建项目的VS版本号信息
  • 编译条件、目标平台、编译输出类型信息
  • 根命名空间、程序集名称
  • .NET Framework 框架版本号
  • IISExpress 调试信息
  • 包含的目录及文件信息(页面文件、js文件、css文件、图片、字体等)
  • 引用的系统程序集信息
  • 引用的本地第三方程序集信息
  • 通过NuGet方式引用的程序集信息
复制代码
  1 <?xml version="1.0" encoding="utf-8"?>
  2 <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  3   <Import Project="..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.props')" />
  4   <Import Project="..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" />
  5   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  6   <PropertyGroup>
  7     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
  8     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
  9     <ProductVersion>
 10     </ProductVersion>
 11     <SchemaVersion>2.0</SchemaVersion>
 12     <ProjectGuid>{FAD3146B-0AB3-4B55-8149-78CFF1E1AFC7}</ProjectGuid>
 13     <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
 14     <OutputType>Library</OutputType>
 15     <AppDesignerFolder>Properties</AppDesignerFolder>
 16     <RootNamespace>DotNetFx461.Web.Study</RootNamespace>
 17     <AssemblyName>DotNetFx461.Web.Study</AssemblyName>
 18     <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
 19     <MvcBuildViews>false</MvcBuildViews>
 20     <UseIISExpress>true</UseIISExpress>
 21     <Use64BitIISExpress />
 22     <IISExpressSSLPort />
 23     <IISExpressAnonymousAuthentication />
 24     <IISExpressWindowsAuthentication />
 25     <IISExpressUseClassicPipelineMode />
 26     <UseGlobalApplicationHostFile />
 27     <NuGetPackageImportStamp>
 28     </NuGetPackageImportStamp>
 29   </PropertyGroup>
 30   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
 31     <DebugSymbols>true</DebugSymbols>
 32     <DebugType>full</DebugType>
 33     <Optimize>false</Optimize>
 34     <OutputPath>bin\</OutputPath>
 35     <DefineConstants>DEBUG;TRACE</DefineConstants>
 36     <ErrorReport>prompt</ErrorReport>
 37     <WarningLevel>4</WarningLevel>
 38   </PropertyGroup>
 39   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
 40     <DebugSymbols>true</DebugSymbols>
 41     <DebugType>pdbonly</DebugType>
 42     <Optimize>true</Optimize>
 43     <OutputPath>bin\</OutputPath>
 44     <DefineConstants>TRACE</DefineConstants>
 45     <ErrorReport>prompt</ErrorReport>
 46     <WarningLevel>4</WarningLevel>
 47   </PropertyGroup>
 48   <ItemGroup>
 49     <Reference Include="Microsoft.CSharp" />
 50     <Reference Include="System" />
 51     <Reference Include="System.Data" />
 52     <Reference Include="System.Drawing" />
 53     <Reference Include="System.Web.DynamicData" />
 54     <Reference Include="System.Web.Entity" />
 55     <Reference Include="System.Web.ApplicationServices" />
 56     <Reference Include="System.ComponentModel.DataAnnotations" />
 57     <Reference Include="System.Core" />
 58     <Reference Include="System.Data.DataSetExtensions" />
 59     <Reference Include="System.Xml.Linq" />
 60     <Reference Include="System.Web" />
 61     <Reference Include="System.Web.Extensions" />
 62     <Reference Include="System.Web.Abstractions" />
 63     <Reference Include="System.Web.Routing" />
 64     <Reference Include="System.Xml" />
 65     <Reference Include="System.Configuration" />
 66     <Reference Include="System.Web.Services" />
 67     <Reference Include="System.EnterpriseServices" />
 68     <Reference Include="Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 69       <Private>True</Private>
 70       <HintPath>..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll</HintPath>
 71     </Reference>
 72     <Reference Include="System.Net.Http">
 73     </Reference>
 74     <Reference Include="System.Net.Http.WebRequest">
 75     </Reference>
 76     <Reference Include="System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 77       <Private>True</Private>
 78       <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.Helpers.dll</HintPath>
 79     </Reference>
 80     <Reference Include="System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 81       <Private>True</Private>
 82       <HintPath>..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll</HintPath>
 83     </Reference>
 84     <Reference Include="System.Web.Optimization">
 85       <HintPath>..\packages\Microsoft.AspNet.Web.Optimization.1.1.3\lib\net40\System.Web.Optimization.dll</HintPath>
 86     </Reference>
 87     <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 88       <Private>True</Private>
 89       <HintPath>..\packages\Microsoft.AspNet.Razor.3.2.7\lib\net45\System.Web.Razor.dll</HintPath>
 90     </Reference>
 91     <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 92       <Private>True</Private>
 93       <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.dll</HintPath>
 94     </Reference>
 95     <Reference Include="System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
 96       <Private>True</Private>
 97       <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Deployment.dll</HintPath>
 98     </Reference>
 99     <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
100       <Private>True</Private>
101       <HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
102     </Reference>
103     <Reference Include="Newtonsoft.Json">
104       <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
105     </Reference>
106     <Reference Include="WebGrease">
107       <Private>True</Private>
108       <HintPath>..\packages\WebGrease.1.6.0\lib\WebGrease.dll</HintPath>
109     </Reference>
110     <Reference Include="Antlr3.Runtime">
111       <Private>True</Private>
112       <HintPath>..\packages\Antlr.3.5.0.2\lib\Antlr3.Runtime.dll</HintPath>
113     </Reference>
114   </ItemGroup>
115   <ItemGroup>
116     <Reference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform">
117       <HintPath>..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll</HintPath>
118     </Reference>
119   </ItemGroup>
120   <ItemGroup>
121     <Compile Include="App_Start\BundleConfig.cs" />
122     <Compile Include="App_Start\FilterConfig.cs" />
123     <Compile Include="App_Start\RouteConfig.cs" />
124     <Compile Include="Controllers\HomeController.cs" />
125     <Compile Include="Global.asax.cs">
126       <DependentUpon>Global.asax</DependentUpon>
127     </Compile>
128     <Compile Include="Models\Class2.cs" />
129     <Compile Include="Properties\AssemblyInfo.cs" />
130   </ItemGroup>
131   <ItemGroup>
132     <Content Include="Content\bootstrap-theme.css" />
133     <Content Include="Content\bootstrap-theme.min.css" />
134     <Content Include="Content\bootstrap.css" />
135     <Content Include="Content\bootstrap.min.css" />
136     <Content Include="favicon.ico" />
137     <Content Include="fonts\glyphicons-halflings-regular.svg" />
138     <Content Include="Global.asax" />
139     <Content Include="Content\Site.css" />
140     <Content Include="Scripts\bootstrap.js" />
141     <Content Include="Scripts\bootstrap.min.js" />
142     <None Include="Scripts\jquery-3.4.1.intellisense.js" />
143     <Content Include="Scripts\jquery-3.4.1.js" />
144     <Content Include="Scripts\jquery-3.4.1.min.js" />
145     <Content Include="Scripts\jquery-3.4.1.slim.js" />
146     <Content Include="Scripts\jquery-3.4.1.slim.min.js" />
147     <None Include="Scripts\jquery.validate-vsdoc.js" />
148     <Content Include="Scripts\jquery.validate.js" />
149     <Content Include="Scripts\jquery.validate.min.js" />
150     <Content Include="Scripts\jquery.validate.unobtrusive.js" />
151     <Content Include="Scripts\jquery.validate.unobtrusive.min.js" />
152     <Content Include="Scripts\modernizr-2.8.3.js" />
153     <Content Include="Web.config" />
154     <Content Include="Web.Debug.config">
155       <DependentUpon>Web.config</DependentUpon>
156     </Content>
157     <Content Include="Web.Release.config">
158       <DependentUpon>Web.config</DependentUpon>
159     </Content>
160     <Content Include="Views\Web.config" />
161     <Content Include="Views\_ViewStart.cshtml" />
162     <Content Include="Views\Shared\Error.cshtml" />
163     <Content Include="Views\Shared\_Layout.cshtml" />
164     <Content Include="Views\Home\About.cshtml" />
165     <Content Include="Views\Home\Contact.cshtml" />
166     <Content Include="Views\Home\Index.cshtml" />
167   </ItemGroup>
168   <ItemGroup>
169     <Folder Include="App_Data\" />
170   </ItemGroup>
171   <ItemGroup>
172     <Content Include="fonts\glyphicons-halflings-regular.woff2" />
173     <Content Include="fonts\glyphicons-halflings-regular.woff" />
174     <Content Include="fonts\glyphicons-halflings-regular.ttf" />
175     <Content Include="fonts\glyphicons-halflings-regular.eot" />
176     <Content Include="Content\bootstrap.min.css.map" />
177     <Content Include="Content\bootstrap.css.map" />
178     <Content Include="Content\bootstrap-theme.min.css.map" />
179     <Content Include="Content\bootstrap-theme.css.map" />
180     <None Include="packages.config" />
181     <Content Include="Scripts\jquery-3.4.1.slim.min.map" />
182     <Content Include="Scripts\jquery-3.4.1.min.map" />
183   </ItemGroup>
184   <ItemGroup>
185     <Analyzer Include="..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll" />
186     <Analyzer Include="..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.NetAnalyzers.dll" />
187   </ItemGroup>
188   <PropertyGroup>
189     <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
190     <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
191   </PropertyGroup>
192   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
193   <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
194   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
195   <Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
196     <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
197   </Target>
198   <ProjectExtensions>
199     <VisualStudio>
200       <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
201         <WebProjectProperties>
202           <UseIIS>True</UseIIS>
203           <AutoAssignPort>True</AutoAssignPort>
204           <DevelopmentServerPort>4565</DevelopmentServerPort>
205           <DevelopmentServerVPath>/</DevelopmentServerVPath>
206           <IISUrl>http://localhost:4565/</IISUrl>
207           <NTLMAuthentication>False</NTLMAuthentication>
208           <UseCustomServer>False</UseCustomServer>
209           <CustomServerUrl>
210           </CustomServerUrl>
211           <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
212         </WebProjectProperties>
213       </FlavorProperties>
214     </VisualStudio>
215   </ProjectExtensions>
216   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
217     <PropertyGroup>
218       <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>
219     </PropertyGroup>
220     <Error Condition="!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\build\net46\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
221     <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.props'))" />
222     <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.targets'))" />
223   </Target>
224   <Import Project="..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.targets" Condition="Exists('..\packages\Microsoft.CodeAnalysis.NetAnalyzers.6.0.0\build\Microsoft.CodeAnalysis.NetAnalyzers.targets')" />
225   <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
226        Other similar extension points exist, see Microsoft.Common.targets.
227   <Target Name="BeforeBuild">
228   </Target>
229   <Target Name="AfterBuild">
230   </Target> -->
231 </Project>
View Code
复制代码

仔细阅读上述配置信息,可以得出如下结论:

(1)打开方式:本地文件资源管理器

(2)内容:管理项较多,内容复杂。

(3)文件大小:12K。

(4)项目文件包含:强关联(第119行至182行,通过<Content Include="xxx文件" />实现包含),包含文件夹与文件。

(5)项目文件排除:从项目文件中直接删除 <Content Include="xxx文件" /> 配置项。

.NET Core / .NET6 平台下的 ASP.NET Core Web 项目文件结构

新建一个 ASP.NET Core 6.0 Web 项目,结构如下

打开项目所在的目录,找到“DotNet6_Web_Study.csproj”项目文件

打开“DotNet6_Web_Study.csproj”项目文件内容如下:

复制代码
 1 <Project Sdk="Microsoft.NET.Sdk.Web">
 2 
 3   <PropertyGroup>
 4     <TargetFramework>net6.0</TargetFramework>
 5     <Nullable>enable</Nullable>
 6     <ImplicitUsings>enable</ImplicitUsings>
 7   </PropertyGroup>
 8 
 9 
10   <ItemGroup>
11     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.7" />
12   </ItemGroup>
13 
14   <ItemGroup>
15     <ProjectReference Include="..\DotNet6_Study.Common\DotNet6_Study.Common.csproj" />
16   </ItemGroup>
17 
18 </Project>
复制代码

这种方式打开相对麻烦,.NET Core /.NET6+ 项目提供了直接编辑项目文件的便捷方式。点击项目名称,右键->编辑项目文件

在VS中直接打开.csproj文件,并且可以直接编辑,保存后即刻生效

【直接编辑项目文件】的功能不限于ASP.NET Core Web项目,同样适用于基于.NET Core/.NET6+平台创建的控制台应用程序、WinForm窗体程序、WPF程序等。

默认的项目文件内容如下:

复制代码
 1 <Project Sdk="Microsoft.NET.Sdk.Web">
 2 
 3   <PropertyGroup>
 4     <TargetFramework>net6.0</TargetFramework>
 5     <Nullable>enable</Nullable>
 6     <ImplicitUsings>enable</ImplicitUsings>
 7   </PropertyGroup>
 8 
 9 
10   <ItemGroup>
11     <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.7" />
12   </ItemGroup>
13 
14   <ItemGroup>
15     <ProjectReference Include="..\DotNet6_Study.Common\DotNet6_Study.Common.csproj" />
16   </ItemGroup>
17 
18 </Project>
复制代码

(1)打开方式:本地文件资源管理器、VS中直接打开并编辑,更便捷。

(2)内容:管理项内容简洁。

(3)文件大小:1K。

(4)项目文件包含

  在ASP.NET Core中,项目文件不包含任何文件夹或文件引用,改由文件系统来确定哪些文件或文件夹属于项目。在项目的根目录中存在的所有文件或文件夹都属于项目的一部分,并将显示在解决方案资源管理器中。因此当开发者在添加文件或文件夹时,该文件或文件夹将自动变成项目的一部分,会立即显示在解决方案资源管理器中。

(5)项目文件排除:通过 <Compile Remove="xxxx文件" /> 实现。

当在解决方案资源管理器的任何文件夹中删除文件或文件夹时,被删除的文件或文件夹不再是项目的一部分,在解决方案资源管理器中将不再显示。

 

通过以上对比,可以得出如下结论:

  在.NET Framework项目中,项目中所有的代码文件都要添加到*.csproj文件中,如果一个C#文件放在项目文件夹下,但是没有被添加到*.csproj文件中,那么这个文件是不会被编译的。
  用.NET Framework开发过团队项目的开发人员可能遇到过*.csproj文件修改冲突的问题。两个开发人员共同开发一个项目,各自向项目中添加了文件,就很容易造成*.csproj文件修改冲突的问题,这非常影响团队开发的效率。
  但是.NET Core项目就不同了,.NET Core项目中的文件不用添加到*.csproj.文件中,项目下所有的文件默认都被自动包含到项目中,除非被手动排除。*.csproj文件中.NET Framework项目中的配置方式正好和.NET Core中的相反,毕竟在开发项目的时候,开发人员主动排除某个文件不是经常发生的,而向项目中添加文件是非常频繁的操作,.NET Core这样的优化尽可能避免了文件修改的冲突,从而提升了团队开发的效率。.NET Framework和.NET Core项目还有一个不同之处就是.NET Core项目没有App.config或Web.config文件,因为NET Core项目中的配置有不同的使用方式,在后续的博客中会有详细的讲解。

.NET 项目 SDK
  .NET Core 和 .NET5 及更高版本项目与软件开发工具包 (SDK) 关联。 每个项目 SDK 都是一组 MSBuild 目标和相关的任务,它们负责编译、打包和发布代码。 引用项目 SDK 的项目有时称为“SDK 样式的项目”。有以下 SDK 可用:

更多信息请参考微软官方文档《.NET 项目 SDK》:https://docs.microsoft.com/zh-CN/dotnet/core/project-sdk/overview

  .NET SDK 是 .NET 的基本 SDK。 其他 SDK 引用 .NET SDK,与其他 SDK 关联的项目具有所有可用的 .NET SDK 属性。 例如,Web SDK 依赖于 .NET SDK 和 Razor SDK。还可以创建自己的 SDK,并通过 NuGet 进行分发。

  .NET 项目基于 MSBuild 格式。 具有扩展名(如用于 C# 项目的 .csproj 和用于 F# 项目的 .fsproj)的项目文件都是 XML 格式的 。 MSBuild 项目文件的根元素是 Project 元素。 Project 元素有一个可选的 Sdk 属性,该属性指定要使用的 SDK(和版本)。 若要使用 .NET 工具并构建你的代码,请将 Sdk 属性设置为 可用 SDK 表中的其中一个 ID。

<TargetFramework>元素用于指定应用程序的目标框架,比如我们的应用程序中的TargetFramework的值为net6.0。

.NET Core 引入了一个Target Framework Moniker,简称TFM。目标框架通常由 TFM 引用。 下表显示 .NET SDK 和 NuGet 客户端支持的目标框架,等效项显示在括号内。 例如,win81 对于 netcore451 来说等效于 TFM。

关于《SDK 样式项目中的目标框架》,请参考微软官方文档:https://docs.microsoft.com/zh-cn/dotnet/standard/frameworks


参考文献:

  • https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/?view=aspnetcore-6.0&tabs=windows
posted @   张传宁  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2019-09-10 C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息
2019-09-10 C#开发BIMFACE系列25 服务端API之获取模型数据10:获取楼层对应面积分区列表
2019-09-10 C#开发BIMFACE系列24 服务端API之获取模型数据9:获取单个房间信息
页脚 HTML 代码
点击右上角即可分享
微信分享提示