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?

Managing dependencies with .NET Core SDK 1.0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM