.NET核心msbuild项目引用

.NET核心msbuild项目引用,msbuild,.net-core,Msbuild,.net Core,我有一个解决方案,其中包含一个控制台应用程序,其中包含一个.csproj文件,如下所示: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp1.1</TargetFramework> </PropertyGroup> </P

我有一个解决方案,其中包含一个控制台应用程序,其中包含一个.csproj文件,如下所示:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>
</Project>
我还有一个库项目,它使用控制台应用程序生成一堆C代码,这些代码被编译到库中,library.csproj文件如下所示

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="RunGenerator">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="../generator/generator.csproj">
      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    </ProjectReference>
  </ItemGroup>
  <Target Name="RunGenerator">
    <Exec Command="dotnet run -p &quot;../generator/generator.csproj&quot; input output" /> 
  </Target>
</Project>
这会失败,因为依赖关系分析指出netstandard1.4程序集不能引用netcoreapp1.1程序集。这是正确的,只是我没有引用程序集

我可以通过如下方式构建generator项目来解决该问题:

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="RunGenerator">
  <PropertyGroup>
    <TargetFramework>netstandard1.4</TargetFramework>
  </PropertyGroup>
  <Target Name="RunGenerator">
    <Exec Command="dotnet build &quot;../generator/generator.csproj&quot;" />
    <Exec Command="dotnet run -p &quot;../generator/generator.csproj&quot; input output" /> 
  </Target>
</Project>
问题是,当使用包含的解决方案文件生成这些项目时,生成器项目不再参与依赖关系分析,并且生成器项目的显式生成有时与解决方案生成启动的同一项目的另一个生成同时运行,这会导致错误,因为文件是锁定等

是否可以在不检查目标框架的情况下拥有项目依赖关系

有人能提出解决办法吗


谢谢。

以下是一些MSBuild技巧。您可能需要结合这些想法中的一些

您可以使用解决方案文件添加显式项目依赖项。请参见此处最初提出的问题:。不幸的是,如果没有VS,这真的很难做到。格式是.sln文件有点像噩梦

要避免并发生成问题,请使用MSBuild任务而不是Exec任务。看

dotnet运行自动调用dotnet构建。这在并发构建中实际上是有问题的。您可以在generator.csproj中添加一个目标,该目标在应用程序生成后运行。dotnet filepath.dll运行已编译的应用程序,而不构建它。

    <Target Name="CompileAnotherProject">
       <MSBuild Projects="../generator/generator.csproj" Targets="Build" />
    </Target>

    <Target Name="RunCodeGen" AfterTargets="Build">
         <Exec Command="dotnet $(AssemblyName).dll input output"
           WorkingDirectory="$(OutDir)" />    
    </Target>