CSharp工程中的几个文件

作者 : 开心源码 本文共4512个字,预计阅读时间需要12分钟 发布时间: 2022-05-14 共301人阅读

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

packages_floder

我们通过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>

sln文件所在目录下也没有packages文件夹。Windows系统下.NET Core中Nuget包位于%UserProfile%\.nuget\packages

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

dotnet nuget locals all -linfo : http-cache: C:\Users\xfh\AppData\Local\NuGet\v3-cacheinfo : global-packages: C:\Users\xfh\.nuget\packages\info : temp: C:\Users\xfh\AppData\Local\Temp\NuGetScratchinfo : plugins-cache: C:\Users\xfh\AppData\Local\NuGet\plugins-cache

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

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

小结

以上,是自己的少量总结,与大家分享。

推荐阅读

Assembly Binding redirect: How and Why?

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » CSharp工程中的几个文件

发表回复