首页 > 编程语言 >基于.NET Framework 4.8.1的ASP.NET Web用Gitlab Runner调用MSBuild之后没有bin\roslyn文件夹的问题

基于.NET Framework 4.8.1的ASP.NET Web用Gitlab Runner调用MSBuild之后没有bin\roslyn文件夹的问题

时间:2024-05-27 19:01:51浏览次数:35  
标签:bin Web dotnetcompilerplatform 4.1 loda roslyn NET packages tools

摘要

基于.NET Framework 4.8.1的传统ASP.NET Web程序,使用Gitlab Runner自动集成,在发布的网站目录下,没有bin\Roslyn文件夹。这里涉及到容易被忽视的Roslyn编译器的知识点。

Roslyn是什么?

在我们的ASP.NET Web项目源代码中有什么体现?

1、web.config下有配置节点

一般在web.config末尾能看到如下配置。

<configuration>
    ………………
	<system.codedom>
		<compilers>
			<!-- For Roslyn -->
			<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
			<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
		</compilers>
	</system.codedom>

</configuration>

上边需要注意最新的包的版本号,目前是4.1.0.0最新。

2、Web项目需要引用两个包

<Project ToolsVersion="12.0" DefaultTargets="Build" Sdk="Microsoft.NET.Sdk.Web" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
	
	<ItemGroup>
		<PackageReference Include="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" Version="4.1.0" />
		<PackageReference Include="Microsoft.Net.Compilers" Version="4.2.0">
			<PrivateAssets>all</PrivateAssets>
			<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
		</PackageReference>
	</ItemGroup>
    
</Project>

Microsoft.CodeDom.Providers.DotNetCompilerPlatform包和嵌入的文件

img

Microsoft.Net.Compilers包和嵌入的文件

img

在MSBuild过程中,Roslyn要做什么?

在我给msbuild.exe带上/v:diag后,得到了详细的日志:

PS:Gitlab Runner控制台的日志超过了4M默认大小,最后修改了Gitlab Runner的日志限制为8M,才得到了如下珍贵的内容。

……………………省略……………………

WebProjectOutputDir = X:\gitlab-runner\builds\01\nxx6sgtBR\0\loda.framework.erp\framework\passport\单点登录系统\Yee.Passport.Web
WebProjectOutputDirInsideProject = True
WebProjectOutputDirInsideProjectDefault = True

……………………省略……………………

标“CopyRoslynCompilerFilesToOutputDirectory: (目标 ID: 725)”(目标“PrepareForRun”依赖于它):
任务“Copy” (任务 ID: 612)
  任务参数:DestinationFolder=X:\gitlab-runner\builds\01\nxx6sgtBR\0\loda.framework.erp\framework\passport\单点登录系统\Yee.Passport.Web\bin\roslyn (任务 ID: 612)
  任务参数:SkipUnchangedFiles=True (任务 ID: 612)
  任务参数:
      SourceFiles=
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csc.exe
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csc.exe.config
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csc.rsp
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csi.exe
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csi.exe.config
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\csi.rsp
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.Build.Tasks.CodeAnalysis.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CodeAnalysis.CSharp.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CodeAnalysis.CSharp.Scripting.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CodeAnalysis.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CodeAnalysis.Scripting.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CodeAnalysis.VisualBasic.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.CSharp.Core.targets
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.DiaSymReader.Native.amd64.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.DiaSymReader.Native.x86.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.Managed.Core.CurrentVersions.targets
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.Managed.Core.targets
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\Microsoft.VisualBasic.Core.targets
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Buffers.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Collections.Immutable.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Memory.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Numerics.Vectors.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Reflection.Metadata.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Runtime.CompilerServices.Unsafe.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Text.Encoding.CodePages.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\System.Threading.Tasks.Extensions.dll
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\vbc.exe
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\vbc.exe.config
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\vbc.rsp
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\VBCSCompiler.exe
          C:\Users\loda\.nuget\packages\microsoft.codedom.providers.dotnetcompilerplatform\4.1.0\tools\roslyn-4.1.0\VBCSCompiler.exe.config (任务 ID: 612)
  任务参数:Retries=0 (任务 ID: 612)
  正在创建目录“X:\gitlab-runner\builds\01\nxx6sgtBR\0\loda.framework.erp\framework\passport\单点登录系统\Yee.Passport.Web\bin\roslyn”。 (任务 ID: 612)

上述日志是关键的内容,有两个看点:

  • WebProjectOutputDir没有使用我在msbuild.exe传入的参数 /p:WebProjectOutputDir=$web_output_path
    很奇怪,网站的确发布到了msbuild.exe指定的WebProjectOutputDir目录下。
  • Roslyn工作正常,只是把产物拷贝到了解决方案之内,Gitlab Runner去了接下来的stage发布网站,是找不到上一个stage的目录下的文件的。

解决办法

在.csproj的Project定义一个自定义复制的任务:

<Target Name="CopyRoslynCompilerFilesToOutputDirectory2" AfterTargets="_CopyWebApplication">
	<ItemGroup>
		<RoslynFiles Include="$(CscToolPath)\*" />
	</ItemGroup>
	<PropertyGroup>
		<!--<LodaRoslynFolder>$(WebProjectOutputDir)\bin\roslyn</LodaRoslynFolder>-->
	</PropertyGroup>
	<MakeDir Directories="$(WebProjectOutputDir)\bin\roslyn" />
	<Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(WebProjectOutputDir)\bin\roslyn" SkipUnchangedFiles="true" Retries="$(CopyRetryCount)" RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)" />
</Target>

上边的配置的看点是AfterTargets="_CopyWebApplication",之所以设置在“_CopyWebApplication”这个Target之后,是我发现msbuild.exe最终把网站发布到了我指定的WebProjectOutputDir。因此_CopyWebApplication这个Target之后,WebProjectOutputDir这个参数是正常采用了msbuild.exe中接收到的参数。

至于Roslyn工作的时候,为什么日志里清晰的表明WebProjectOutputDir不采用msbuild.exe接收的参数呢?暂时没时间去查文档了。

后记

折腾了接近2天,写出来让大家少走弯路。已经很少有基于.NET Framework的项目还要老树发新枝了吧?

标签:bin,Web,dotnetcompilerplatform,4.1,loda,roslyn,NET,packages,tools
From: https://www.cnblogs.com/amisoft/p/18216217/roslyn-in-aspnet-web-project

相关文章

  • BUUCTF-WEB(41-45)
    [NCTF2019]FakeXMLcookbook代码处找到题目也提示了是xxe,我们抓包搞一下<?xmlversion="1.0"encoding="utf-8"?><!DOCTYPEhack[<!ENTITYxxe"hack">]><user><username>&xxe;</username><password>123&......
  • .net 8 api部署到iis出现500.19
    1.先下载了.net8sdk包,sdk包自带运行时。2.通过文件发布api到iis3.点击运行出现500.19,已经程序池改为无托管代码,并无效果4.点击模块发现core的api无法展示模块列表,framework可以展示 5.下载dotnet-hosting-2.2.5-win 问题解决链接:https://download.visualstudio.microsoft.com......
  • 传统的ASP.NET Web Form程序如何使用最新的MSBuild特性
    摘要旧的.csproj文件,在使用NuGet包的时候,会随着引用一个包,一下子添加n多个包。我们把旧的.csproj文件迁移到最新的格式,就能避免这个问题。直接上效果<ProjectToolsVersion="12.0"DefaultTargets="Build"Sdk="Microsoft.NET.Sdk.Web"xmlns="http://schemas.microsoft.com/de......
  • WebSocket服务搭建
    1、在NuGet包管理工具安装websocket包 2、添加自定义中间件app.UseWebSockets();app.UseMiddleware<CustomWebSocketMiddleware>();3、编写websocket中间件privatereadonlyRequestDelegate_next;privateILogger<CustomWebSocketMiddleware>_Logger;publicList<Web......
  • websocket实现消息实时通信
    后端代码实现1、导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>3.2.5</version></dependency>2、创建websocket客户端对象。@Getter@Set......
  • 使用.Net Core开发WPF App系列教程( 八、WPF中的常用控件(下))
    使用.NetCore开发WPFApp系列教程一、.NetCore和WPF介绍二、在VisualStudio2019中创建.NetCoreWPF工程三、与.NetFramework的区别四、WPF中的XAML五、WPF中的布局六、WPF中的常用控件(上)七、WPF中的常用控件(中)八、WPF中的常用控件(下)其它、实现多语言切换的几种方......
  • dot net core使用BackgroundService运行一个后台服务
    不管是在控制台程序还是asp.netcore程序中,我们经常会有用到一个需要长时间运行的后台任务的需求。通常最直觉的方式是使用Thread实例来新建一个线程,但是这样需要自行管理线程的启动和停止。在.netcore中提供了一个继承自IHostedService的基类BackgroudService能够方便地实现一......
  • 基于Selenium+webdriver对Web应用系统进行功能测试
    以Java格式的脚本,在JUnit框架上执行和调试这些脚本。项目语言与架构选项为在pom.xml中添加的依赖在kotlin目录中添加Java类,开始编写测试代码:找到chrome的版本并下载对应版本的chromedriver,在setProperty中将chromedriver.exe的路径完善后就可以开始测试。chromedriver全版......
  • 【CTF Web】CTFShow web9 Writeup(RCE+PHP+代码审计)
    web91阿呆在埃塞俄比亚终于找了一个网管的工作,闲暇时还能种点菜。解法可知flag在config.php。<?php#flaginconfig.phpinclude("config.php");if(isset($_GET['c'])){$c=$_GET['c'];if(preg_match("/system|exec|highlight/i",$c......
  • 【CTF Web】CTFShow web10 Writeup(RCE+PHP+代码审计)
    web101阿呆看见对面二黑急冲冲的跑过来,告诉阿呆出大事了,阿呆问什么事,二黑说:这几天天旱,你菜死了!解法可知flag在config.php。<?php#flaginconfig.phpinclude("config.php");if(isset($_GET['c'])){$c=$_GET['c'];if(!preg_match("/system|......