.net MSBuild为Net6.0编译程序集

qij5mzcb  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(238)

为了构建我们的应用程序,我们有一个由几个MSBuild proj文件组成的结构,这些文件目前在.NET Framework上编译库。
现在我们想将解决方案移到.Net 6.0,但是我们使用的任务(“CSC”)在使用相同的参数时给予了我们许多错误。看起来这不是为了从MSBuild中制作Net6.0程序集而做的。
澄清一下,这不仅仅是一个项目,而是一个项目层次:

  1. Project 1具有依赖于Project 2的生成目标。
  2. Project 2具有依赖于Project 3的生成目标。
  3. Project 3执行一些生成CS文件的自定义任务,并将其编译到一个库中,然后由Project 2使用。
    所有操作都是通过msbuild proj文件完成的,例如:
    Project1.proj:
<Project DefaultTargets = "Build">
   <Target Name = "BusinessRuless">
    <MSBuild Projects=".\Project2.proj" Targets="Build" />
  </Target>   
  <Target Name = "Build" DependsOn ="BusinessRuless">
    <CSC Sources = "@(CSFile)"
            References="$(dlls);"
            DebugType="full"
            DefineConstants="TRACE"
            TargetType="library"
            EmitDebugInformation="true"
            TreatWarningsAsErrors="true"
            OutputAssembly = "$(dllFileName).dll">
        </CSC>
  </Target>
...

当CSC任务启动时,它调用正确的csc编译器:
C:\程序文件\Microsoft Visual Studio \2022\微软内部版本\当前\二进制文件\罗斯林\csc.exe
但是,它会抛出错误,就好像没有引用基本系统程序集一样:
CSC:错误CS 0518:未定义或导入预定义类型“System.Void”[....proj]
所以总的来说问题是:有什么诀窍可以使用MSBuild生成针对Net6.0的项目吗?
我需要显式引用Nuget的所有基础DLL吗?
顺便说一句:我试着添加其中的一个,比如“C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.9\ref\net6.0\System.Runtime.dll”,但是出现了同样的错误:未定义或导入预定义类型“System.Void”
我们不使用Visual Studio来构建我们的库,只使用MSBuild。
谢谢!

ruoxqz4g

ruoxqz4g1#

最后我终于能够做到这一点,这里是我发现:
1-获取程序集的dotnet位置。我使用以下片段获取dotnet文件夹:

<Choose>
    <When Condition=" '$(DOTNET_ROOT)'=='' ">
      <PropertyGroup>
        <DotNetRoot>$(ProgramFiles)\dotnet</DotNetRoot>
      </PropertyGroup>
    </When>
    <Otherwise>
      <PropertyGroup>
        <DotNetRoot>$(DOTNET_ROOT)</DotNetRoot>
      </PropertyGroup>
    </Otherwise>
  </Choose>

然后创建程序集位置的属性(不知道从哪里获取版本号,所以它是硬编码的)

<PropertyGroup>
    <TargetFrameworkMoniker>.NETCoreApp,Version=v6.0</TargetFrameworkMoniker>
    <TargetFramework>net6.0</TargetFramework>
    <DotNetAssemblies>$(DotNetRoot)\packs\Microsoft.NETCore.App.Ref\6.0.9\ref\net6.0</DotNetAssemblies>
</PropertyGroup>

2-使用NoStandardLib=“true”阻止CSC任务使用标准库
3-通过使用Nullable=“enable”允许空值
4-向CS文件使用的标准库添加特定参照。
总之,CSC任务如下所示:

<CSC Sources="@(CSFile)" References="...$(dotNetAssemblies)\System.Runtime.dll;$(dotNetAssemblies)\System.dll;$(dotNetAssemblies)\System.Threading.Tasks.dll;"  
         DebugType="full" TargetType="library" EmitDebugInformation="true" TreatWarningsAsErrors="true" OutputAssembly="$(dllFileName).dll"
         NoStandardLib="true" Nullable="enable">
</CSC>

相关问题