web-dev-qa-db-fra.com

La nouvelle structure de fichiers csproj peut-elle être utilisée avec un projet ASP.NET Framework?

Le nouveau format .csproj comprend des améliorations significatives par rapport aux fichiers classiques, notamment une intégration étroite avec la gestion des packages NuGet et une structure beaucoup moins verbeuse. Je souhaite bénéficier de ces avantages tout en utilisant le .NET Framework 4.6 et ASP.NET (car mon projet dépend d'Umbraco qui n'a pas encore produit de version .NET Core).

Le plus grand défi semble être l'expérience de débogage - un projet ASP.NET Core s'attend à exécuter une application de base dotnet et à configurer un proxy inverse vers une instance IIS. Ce processus est complètement étranger à le modèle .NET Framework et je ne sais pas par où commencer pour essayer de configurer le débogage dans Visual Studio.

Existe-t-il un moyen de mélanger ces deux modèles de projet?

23
Paul Turner

Il y a un tas de problèmes ouverts sur GitHub concernant la prise en charge du nouveau format csproj pour les applications ASP.NET (non-Core). Certains d'entre eux:

Comme vous l'avez probablement déjà compris, le nouveau format csproj n'est pas encore pris en charge pour les applications ASP.NET. Il est possible de le faire fonctionner, mais ce ne sera pas fluide.

Il y a quelque temps, j'ai essayé de créer un projet ASP.NET MVC au nouveau format csproj, juste pour le plaisir. Je l'ai fait fonctionner, mais je n'avais pas beaucoup joué avec. Il sera donc intéressant de connaître votre expérience.

Les étapes sont les suivantes:

  1. Supprimez les anciens fichiers de projet non requis:

    • MvcApplication.csproj
    • MvcApplication.csproj.user
    • packages.config
  2. Créez un nouveau MvcApplication.csproj avec le contenu suivant:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <TargetFramework>net461</TargetFramework>
      </PropertyGroup>
    
      <PropertyGroup>
        <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
        <OutputPath>bin\</OutputPath>
      </PropertyGroup>
    
      <ItemGroup>
        <PackageReference Include="Antlr" version="3.4.1.9004" />
        <PackageReference Include="bootstrap" version="3.0.0" />
        <PackageReference Include="jQuery" version="1.10.2" />
        <PackageReference Include="jQuery.Validation" version="1.11.1" />
        <PackageReference Include="Microsoft.ApplicationInsights" version="2.2.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.Agent.Intercept" version="2.0.6" />
        <PackageReference Include="Microsoft.ApplicationInsights.DependencyCollector" version="2.2.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.2.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.Web" version="2.2.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.WindowsServer" version="2.2.0" />
        <PackageReference Include="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.2.0" />
        <PackageReference Include="Microsoft.AspNet.Mvc" version="5.2.3" />
        <PackageReference Include="Microsoft.AspNet.Razor" version="3.2.3" />
        <PackageReference Include="Microsoft.AspNet.Web.Optimization" version="1.1.3" />
        <PackageReference Include="Microsoft.AspNet.WebPages" version="3.2.3" />
        <PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" version="1.0.5" />
        <PackageReference Include="Microsoft.CSharp" Version="4.4.1" />
        <PackageReference Include="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" />
        <PackageReference Include="Microsoft.Net.Compilers" version="2.1.0" developmentDependency="true" />
        <PackageReference Include="Microsoft.Web.Infrastructure" version="1.0.0.0" />
        <PackageReference Include="Modernizr" version="2.6.2" />
        <PackageReference Include="Newtonsoft.Json" version="6.0.4" />
        <PackageReference Include="Respond" version="1.2.0" />
        <PackageReference Include="WebGrease" version="1.5.2" />
      </ItemGroup>
    
      <ItemGroup>
        <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
      </ItemGroup>
    
      <ItemGroup>
        <Reference Include="System.Web" />
      </ItemGroup>
    
      <ItemGroup>
        <Compile Update="Global.asax.cs">
          <DependentUpon>Global.asax</DependentUpon>
        </Compile>
      </ItemGroup>
    
      <ItemGroup>
        <Content Include="Web.config">
          <SubType>Designer</SubType>
        </Content>
        <Content Include="Web.*.config">
          <DependentUpon>Web.config</DependentUpon>
          <SubType>Designer</SubType>
        </Content>
      </ItemGroup>
    
    </Project>
    

    La longue liste de packages ci-dessus inclut des packages par défaut ajoutés pour l'application ASP.NET MVC par défaut. Vous devez ajouter d'autres packages utilisés par votre application.

    N'oubliez pas d'ajouter le Microsoft.CSharp package, sinon vous obtiendrez l'erreur de compilation suivante sur les affectations ViewBag:

    erreur CS0656: Le compilateur manquant a requis le membre "Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create"

    Dans les projets ASP.NET, Microsoft.CSharp est ajouté comme référence au projet. Mais il vaut mieux le consommer en tant que package NuGet.

    La seule référence directe qui n'a pas pu être évitée est un System.Web.

  3. Débogage du projet

    Vous aviez raison de dire que le débogage pouvait être pénible. Étant donné que Visual Studio ne sait pas qu'il s'agit d'une application ASP.NET, il n'existe aucune méthode instantanée pour démarrer la session de débogage.

    Je vois ici 2 solutions possibles:

    une. Utilisez IIS Express pour le débogage.

    Il est assez facile de configurer le débogage basé sur IIS exécutable Express. Créez simplement le profil de débogage suivant:

    enter image description here

    LaunchSettings.json correspondant:

    {
      "profiles": {
        "ASP.NET Old csproj": {
          "commandName": "Executable",
          "executablePath": "c:\\Program Files\\IIS Express\\iisexpress.exe",
          "commandLineArgs": "/path:\"$(SolutionDir)$(ProjectName)\" /port:12345"
        }
    }
    

    b. Utilisez IIS pour le débogage.

    Dans IIS Manager, créez une application qui pointe vers un répertoire avec votre projet. Vous pouvez maintenant déboguer votre application en l'attachant à w3wp.exe processus.

Voici Exemple de projet sur GitHub . Il s'agit essentiellement d'un projet ASP.NET MVC par défaut migré vers le nouveau format csproj en suivant les étapes ci-dessus. Il pourrait être compilé, exécuté et débogué (profil pour IIS Express inclus)

46
CodeFuller