为了构建我们的应用程序,我们有一个由几个MSBuild proj文件组成的结构,这些文件目前在.NET Framework上编译库。
现在我们想将解决方案移到.Net 6.0,但是我们使用的任务(“CSC”)在使用相同的参数时给予了我们许多错误。看起来这不是为了从MSBuild中制作Net6.0程序集而做的。
澄清一下,这不仅仅是一个项目,而是一个项目层次:
- Project 1具有依赖于Project 2的生成目标。
- Project 2具有依赖于Project 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。
谢谢!
1条答案
按热度按时间ruoxqz4g1#
最后我终于能够做到这一点,这里是我发现:
1-获取程序集的dotnet位置。我使用以下片段获取dotnet文件夹:
然后创建程序集位置的属性(不知道从哪里获取版本号,所以它是硬编码的)
2-使用NoStandardLib=“true”阻止CSC任务使用标准库
3-通过使用Nullable=“enable”允许空值
4-向CS文件使用的标准库添加特定参照。
总之,CSC任务如下所示: