CSharp工程中的几个文件

以下基于.NET Framework4.6及.NET Core2.0

.csproj

用于配置项目信息,如:

  • 程序集名称、类型
  • Framework版本
  • 项目所包含的文件信息,如:cs、html、js、config、xml等
  • 项目所引用的程序集信息,包含本地dll与Nuget包
  • 其它信息

Visual Studio中对项目所做的配置,均可在该文件中体现出来。同样,Visual Studio也是根据该文件中的内容来加载项目的。抛开Visual Studio的其它功能,可以将其看作是.csproj文件的图形管理工具。

Web.config & App.config

.NET Framework

使用Visual Studio创建Web项目(MVC或Web Api)时,会在根目录生成Web.config文件。创建控制台程序则会生成App.config文件。以Web.config为例,该文件用于配置Web项目运行时所需的信息,如:

  • Framework版本信息
<system.web>
  <compilation debug="true" targetFramework="4.6.2"/>
  <httpRuntime targetFramework="4.6.2"/>
</system.web>
  • 编译器信息
<system.codedom>
  <compilers>
    <compiler language="c#;cs;csharp" extension=".cs"
      type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
      warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
  </compilers>
</system.codedom>
  • 所引用的程序集信息 注意,这里所引用的是项目在运行时所需的程序集,而.csproj中描述的程序集是项目中添加的引用,二者有区别:项目中添加的引用在运行时未必会用到。
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"/>
      <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0"/>
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35"/>
      <bindingRedirect oldVersion="0.0.0.0-5.2.4.0" newVersion="5.2.4.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

若项目启动后报错:未能加载文件或程序集“XXXXXX”或它的某一个依赖项,找到的程序集清单定义与程序集引用不匹配,则应当检查下项目所引用的dll文件与Web.config中配置的dll文件信息是否一致。

点击此处,可查看关于配置文件中bindingRedirect的解释。

.NET Core

.NET Core官方项目模板中默认不生成App.config或Web.config。注意,.NET Core项目(Console、ASP.NET Core)本质上是控制台程序,若要使用XML格式作为配置文件,建议使用App.config。

Nuget & packages.config

Nuget

Windows系统中,可通过%AppData%\NuGet\NuGet.config对Nuget进行配置,文件结构如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="globalPackagesFolder" value="D:\Dev\Nuget\Packages" />
  </config>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
  </packageSources>
  <packageRestore>
    <add key="enabled" value="True" />
    <add key="automatic" value="True" />
  </packageRestore>
  <bindingRedirects>
    <add key="skip" value="False" />
  </bindingRedirects>
  <packageManagement>
    <add key="format" value="0" />
    <add key="disabled" value="False" />
  </packageManagement>
  <disabledPackageSources>
  </disabledPackageSources>
</configuration>

.NET Framework

packages.config是项目中用于管理Nuget包的引用的文件,对于Nuget包的操作(添加、删除与版本变更)都会反映到该文件中。也可以直接操作该文件来修改项目中的Nuget包,但不建议这么做。文件结构如下:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.2.0" targetFramework="net462" />
  <package id="Microsoft.AspNet.WebApi" version="5.2.4" targetFramework="net462" />
</packages>

默认在sln文件所在目录下会生成packages文件夹用于存放项目引用的Nuget包:

我们通过Nuget命令行或者Visual Studio中的图形界面来管理Nuget包,当Nuget包发生变更时,packages.config与.csproj文件内容及packages文件夹都会发生相应的变化。如,我们添加对Dapper的引用后

packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Dapper" version="1.50.0" targetFramework="net461" />
</packages>

.csproj:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <ItemGroup>
        <Reference Include="Dapper, Version=1.50.0.0, Culture=neutral, processorArchitecture=MSIL">
            <HintPath>..\packages\Dapper.1.50.0\lib\net451\Dapper.dll</HintPath>
        </Reference>
    </ItemGroup>
</Project>

若直接修改packages.config中的内容,如,直接删除packages.config中对某个包的引用,.csproj文件中依然保留了对该包的引用,及packages文件夹中也会保留该包。这样很有可能导致项目引用的混乱,所以,不建议直接操作packages.config文件。

.NET Core

.NET Core项目中不在使用packages.config文件文件管理Nuget包,对于Nuget包的引用直接反映到.csproj文件中:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
    </PropertyGroup>
    <ItemGroup>
        <Folder Include="wwwroot\"/>
    </ItemGroup>
    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.App"/>
        <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" PrivateAssets="All"/>
    </ItemGroup>
</Project>

Windows系统下.NET Core中Nuget包位于%UserProfile%\.nuget\packages

可以使用.NET Core提供的CLI中的命令来获取nuget包的位置:

dotnet nuget locals all -l

info : http-cache: C:\Users\xfh\AppData\Local\NuGet\v3-cache
info : global-packages: C:\Users\xfh\.nuget\packages\
info : temp: C:\Users\xfh\AppData\Local\Temp\NuGetScratch
info : plugins-cache: C:\Users\xfh\AppData\Local\NuGet\plugins-cache

也可以使用Nuget自身命令来获取nuget包位置:

nuget locals all -l

info : http-cache: C:\Users\xfh\AppData\Local\NuGet\v3-cache
info : global-packages: C:\Users\xfh\.nuget\packages\
info : temp: C:\Users\xfh\AppData\Local\Temp\NuGetScratch

小结

以上,是自己的一些总结,与大家分享。

推荐阅读

Assembly Binding redirect: How and Why?

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

IntelliJ IDEA 2018.3 首个 Beta 版发布!支持 JVM Profiler 呀

IntelliJ IDEA 秋季的重大更新版本 2018.3 宣布进入 Beta 阶段,并已发布首个 Beta 版本。

11220
来自专栏魏艾斯博客www.vpsss.net

更换本地DNS 解决网站访问速度变慢问题

前段时间魏艾斯博客无意中发现 www.vpsss.net 打开速度很慢,打开首页还是内页都要等待 10 多秒才能打开,这就很尴尬了,老魏一直对外说自己博客打开速...

74020
来自专栏依乐祝

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

很多朋友看到.NET Core就认为是ASP.NET Core,其实这是有误区的,因为.NET Core 是开放源代码的通用开发平台 (是一个“平台”),基于这...

18620
来自专栏依乐祝

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的...

11100
来自专栏依乐祝

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它,接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的...

11820
来自专栏Golang语言社区

gops —— Go 程序诊断分析工具

为了能更好的分析程序,需要在我们的项目中加一行 agent 诊断分析代码,用于统计分析程序问题。

30030
来自专栏数据派THU

独家 | 教你使用Keras on Google Colab(免费GPU)微调深度神经网络

在CPU上训练深度神经网络很困难。本教程将指导您如何使用Google Colaboratory上的Keras微调VGG-16网络,这是一个免费的GPU云平台。如...

71510
来自专栏即时通讯技术

技术干货:实时视频直播首屏耗时400ms内的优化实践

直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验。最近正好在做直播首开优化工作,实践中通过多种方案并行,已经能...

54000
来自专栏温安适的blog

写给自己-Hystrix断路器是如何工作的

20181130,Hystrix已经不再维护,这里是学习记录。12月1日才完成,没有完成11月的诺言,捐款记录以上动弹。

18750
来自专栏即时通讯技术

用JWT技术解决IM系统Socket长连接的身份认证痛点

随着瓜子二手车相关业务的发展,公司有多个业务线都接入了IM系统,IM系统中的Socket长连接的安全问题变得越来越重要。本次分享正是基于此次解决Socket长连...

18120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励