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>