• 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%NuGetNuGet.config对Nuget进行配置,文件结构如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <config>
        <add key="globalPackagesFolder" value="D:DevNugetPackages" />
      </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>..packagesDapper.1.50.0lib
    et451Dapper.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%.nugetpackages

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

    dotnet nuget locals all -l
    ​
    info : http-cache: C:UsersxfhAppDataLocalNuGetv3-cache
    info : global-packages: C:Usersxfh.nugetpackages
    info : temp: C:UsersxfhAppDataLocalTempNuGetScratch
    info : plugins-cache: C:UsersxfhAppDataLocalNuGetplugins-cache

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

    nuget locals all -l
    ​
    info : http-cache: C:UsersxfhAppDataLocalNuGetv3-cache
    info : global-packages: C:Usersxfh.nugetpackages
    info : temp: C:UsersxfhAppDataLocalTempNuGetScratch

    小结

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

    推荐阅读

    Assembly Binding redirect: How and Why?

    Managing dependencies with .NET Core SDK 1.0

  • 相关阅读:
    【转载】为什么我的网站加www是打不开的呢
    【转载】IIS网站配置不带www域名直接跳转带www的域名
    【转载】IIS网站如何同时解析带www和不带www的域名
    【转载】C#中将字符串分割成字符数组
    Android面试,简要介绍一下asynctask和handler的优缺点
    Android面试题(2)
    Android面试题(1)
    Android -- 与WEB交互在同一个会话Session中通信
    25匹马的角逐
    Android -- 检测耳机插入状态
  • 原文地址:https://www.cnblogs.com/Cwj-XFH/p/10156118.html
Copyright © 2020-2023  润新知