C# MSBuild。在生成之前创建EmbeddedResource

C# MSBuild。在生成之前创建EmbeddedResource,c#,visual-studio,msbuild,csproj,C#,Visual Studio,Msbuild,Csproj,在编译主单元之前,我想在程序集中嵌入本地引用。但书面目标不起作用 <Target Name="EmbedLocal" BeforeTargets="CoreCompile"> <Message Text="Run EmbedLocal for $(MSBuildProjectFullPath)..." Importance="high"/> <ItemGroup> <EmbeddedResource Include

在编译主单元之前,我想在程序集中嵌入本地引用。但书面目标不起作用

  <Target Name="EmbedLocal" BeforeTargets="CoreCompile">
    <Message Text="Run EmbedLocal for $(MSBuildProjectFullPath)..." Importance="high"/>    
    <ItemGroup>
      <EmbeddedResource Include="@( ReferencePath->WithMetadataValue( 'CopyLocal', 'true' )->Metadata( 'FullPath' ) )"/>
    </ItemGroup>
    <Message Text="Embed local references complete for $(OutputPath)$(TargetFileName)." Importance="high" />
  </Target>

@(EmbeddedResource)此时包含有效的路径列表

更新:
现在,我的导入文件包含:

<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <EmbedLocalReferences Condition=" '$(EmbedLocalReferences)' == '' ">True</EmbedLocalReferences>
  </PropertyGroup>

  <Target Name="EmbedLocal" BeforeTargets="ResolveReferences" Condition=" '$(EmbedLocalReferences)' == 'True' ">
    <Message Text="Run EmbedLocal for $(MSBuildProjectFullPath)..." Importance="high"/>
    <ItemGroup>
      <EmbeddedResource Include="@(ReferenceCopyLocalPaths->WithMetadataValue( 'Extension', '.dll' )->Metadata( 'FullPath' ))">
        <LogicalName>%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
      </EmbeddedResource>
    </ItemGroup>   
    <Message Text="Embed local references complete for $(OutputPath)$(TargetFileName)." Importance="high" />
  </Target>
</Project>

真的
%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)
它很好用。输出程序集包含作为EmbeddedResource的所有.dll引用

MSBuild。在生成之前创建EmbeddedResource

您可以尝试对csproj文件使用BeforeBuild操作来包含嵌入的资源:

  <Target Name="BeforeBuild">
    ... 
    <ItemGroup>
      <EmbeddedResource Include="..."/>
    </ItemGroup>
    ...
  </Target>

我有几个项目,我想包括这个逻辑。我不想复制粘贴它时,它的变化。“BeforeBuild”的使用取决于将导入插入主项目的位置(仅在导入CSharpTargets之后)。@R.Savelyev,明白了。如果您不想逐个修改项目,我们可以使用,但是MSBuild无法触发
,我们必须使用like
。但您将遇到原始问题,无法将资源嵌入到程序集中。如果同时设置
元数据,是否会发生更改?它自动添加到
PrepareForBulid
目标中,用于退出
EmbeddedResource
项。将目标标记为BeforeTargets=“PrepareForBuild”可能会有所帮助。(顺便说一句,现在不鼓励在构建之前命名目标,请使用
BeforeTargets=“BeforeBuild”
/
postertargets=“AfterBuild”
,正如新项目系统在15.3+@R.Savelyev中所做的那样,Martin Ullrich指出了正确的方向,我已经对它进行了测试,它工作正常,您可以检查它是否适合您,有关详细信息,请参阅更新的答案。@MartinUllrich,你说得对。我用BeforeTargets=“PrepareForBuild”测试了它,它工作得很好。在你告诉我之前,我不知道
是否不鼓励构建
,这里是否有任何文档或博客来解释原因,我想了解更多,你能为我提供一些关于它的链接吗?非常感谢:)。
  <Target Name="EmbedLocal" BeforeTargets="PrepareForBuild">
    ... 
    <ItemGroup>
      <EmbeddedResource Include="..."/>
    </ItemGroup>
    ...
  </Target>