以下基于.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?

Managing dependencies with .NET Core SDK 1.0

CSharp工程中的几个文件的更多相关文章

  1. ARC工程中添加非ARC文件

    转载自:http://blog.csdn.net/zhenweicao/article/details/16988543 分类: IOS2013-11-27 17:02 626人阅读 评论(0) 收藏 ...

  2. maven工程中防止mapper.xml文件被漏掉、未加载的方法

    maven工程中防止mapper.xml文件被漏掉.未加载的方法 就是在pom.xml文件中添加以下内容 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉. --&g ...

  3. iOS工程中的info.plist文件

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载 ...

  4. iOS工程中的info.plist文件的完整研究

    原地址:http://blog.sina.com.cn/s/blog_947c4a9f0100zf41.html 们建立一个工程后,会在Supporting files下面看到一个"工程名- ...

  5. ios工程中加入.c/.cpp文件

    如果你在工程里拉入.c/.cpp文件就会导致工程报错, 现在有两种解决方式 1. 把.c文件的后缀全部改成.m的后缀 把.cpp文件的后缀改成.mm的后缀 2. 使用 工程名-Prefix.pch 并 ...

  6. Linux c codeblock的使用(二):在工程中编译多个文件

    (一)前言 我们刚开始学习linux c的时候,一般都是在一个c文件里面写完所有程序,然后用gcc编译这个c文件就好了,十分简单. 但是你有没有想过,如果我们希望将不同模块的代码放到不同的c文件,然后 ...

  7. Spring -09 -在Spring工程 中加载 properties 文件 -为某个属性添加注解赋初值

    1.在src 下新建 xxx.properties 文件,不要任意加空格,注明jdbc等标识名!2.在spring 配置文件中先引入xmlns:context,在下面添加2.1如果需要记载多个配置文件 ...

  8. 清理Visual Studio中VC++工程里不需要的文件

    Visual Studio开发C++,工程的空间几M,几十M甚至几百M的长,生成的中间文件看的眼花缭乱,占空间不说,特别是备份拷贝代码时无奈的等待,有了这个脚本,好吧,整个世界清静了. @echo o ...

  9. Servlet接口的实现类,路径配置映射,ServletConfig对象,ServletContext对象及web工程中文件的读取

    一,Servlet接口实现类:sun公司为Servlet接口定义了两个默认的实现类,分别为:GenericServlet和HttpServlet. HttpServlet:指能够处理HTTP请求的se ...

随机推荐

  1. 在使用可变数组过程中遇到*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'问题

    *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFD ...

  2. 包建强的培训课程(1):Android App企业级开发

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. 2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院

    2016安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院 从小就很羡慕学霸的脑子,总有很简单很便捷的方法解出难题来,所以对于他们的笔记总会疯狂地想占有和copy.那么,对CTF大神自己总结出来的赛 ...

  4. feh: linux终端下看图片的好工具

    1) 普通浏览 $ feh * 可以察看当前目录下的所有图片,以及当前子目录里的所有图片 2) 播放幻灯片 (-D)   $ feh -D 2 *.jpg 对所有jpg以幻灯片的方式播放,每两秒放一张 ...

  5. 知识扩展——Git和GitHub的区别

    一直以为Git和GitHub是一个东西,直到我看到这个解释.... 转载自:git与github区别与简介 一开始接触git或是github的程序员可能搞不太清楚这些名词到底指代的是什么,所以在这里稍 ...

  6. python基础-分支判断语句(4)

    1.分支判断语句 1.单一if结构 2.if-else结构 3.if-elif-else结构 4.if嵌套结构 2.单一if结构 只有一种情况的时候 if 条件: 执行语句 说明: if后面的条件成立 ...

  7. remote: Incorrect username or password ( access token )

    解决问题 进入控制面板 用户账号,选择管理您的凭据 修改凭据 修改完成后,保存即可

  8. [Leetcode]895.最大频率栈

    Problem 实现 FreqStack,模拟类似栈的数据结构的操作的一个类. FreqStack 有两个函数: push(int x),将整数 x 推入栈中. pop(),它移除并返回栈中出现最频繁 ...

  9. [P4886] 快递员

    考虑在树上选个点rt作为根,并且快递中心就选这儿.计算出所有配送的代价(2*两段之和),设他们的最大值为Max.若此时存在下列情况时,可以判定Max已经为最优解. 1)存在代价为Max的配送(u,v) ...

  10. NuGet 构建服务器与常用命令

    公司出于某些原因需要自己在内部网络搭建一个私有的 Nuget 服务器,而且要运行在 Linux服务器上面.如果说 Windows 下搭建的话很简单,直接在项目当中引入 Nuget 的库就 OK,这儿的 ...