C# MSBuild任务参数设置,多个参数

C# MSBuild任务参数设置,多个参数,c#,visual-studio,msbuild,C#,Visual Studio,Msbuild,我在几个月的教程之后设置了一个构建任务,该教程允许使用单个命名参数 但是,我想将任务升级为包含多个参数。我有点困难 这是我当前的目标文件 <Project> <PropertyGroup> <ThisAssembly>$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll </ThisAssembly>

我在几个月的教程之后设置了一个构建任务,该教程允许使用单个命名参数

但是,我想将任务升级为包含多个参数。我有点困难

这是我当前的目标文件

<Project>

    <PropertyGroup>
        <ThisAssembly>$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll
        </ThisAssembly>    
        <FirstRun>false</FirstRun>    
        <FirstRun Condition="!Exists('$(ConstantGeneratorOutputFile)')">true</FirstRun>    
    </PropertyGroup>

    <UsingTask TaskName="ourapp.ConstantGeneratorTask"
               AssemblyFile="$(ThisAssembly)" />

    <!-- Pointing 'Outputs' to a non existing file will disable 
    up-to-date checks and run the task every time, there's probably a better way -->
    <Target Name="ourapp" 
            BeforeTargets="BeforeCompile;CoreCompile"
            Inputs="@(ConstantGeneratorSourceFiles)" 
            Outputs="$(ConstantGeneratorOutputFile).nocache">
        
        <ConstantGeneratorTask 
            SourceFiles="@(ConstantGeneratorSourceFiles)" 
            OutputFile="$(ConstantGeneratorOutputFile)"
            AppXamlFile="$(ConstantGeneratorAppXamlFile)"
            NameSpaceName="$(ConstantGeneratorNameSpaceName)"/>
        
        <ItemGroup Condition="Exists('$(ConstantGeneratorOutputFile)')">
            
            <FileWrites Include="$(ConstantGeneratorOutputFile)" />
            
            <Compile Include="$(ConstantGeneratorOutputFile)" 
                     Condition="$(FirstRun) == 'true'" />
            
        </ItemGroup>
    </Target>

</Project>

$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll
假的
真的
下面是读取这些参数的代码

namespace ourapp
{
    public class ConstantGeneratorTask : Task
    {
        [Required]
        public string OutputFile { get; set; } = "";

        [Required]
        public ITaskItem[] SourceFiles { get; set; } = Array.Empty<ITaskItem>();

        [Required]
        public string NameSpaceName { get; set; } = "";

        [Required]
        public string AppXamlFile { get; set; } = "";
名称空间应用程序
{
公共类ConstantGeneratorTask:任务
{
[必需]
公共字符串输出文件{get;set;}=”“;
[必需]
公共ITaskItem[]源文件{get;set;}=Array.Empty();
[必需]
公共字符串名称空间名称{get;set;}=”“;
[必需]
公共字符串AppXamlFile{get;set;}=”“;
这是csproj的参数

    <ConstantGeneratorOutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs
    </ConstantGeneratorOutputFile>

    <ConstantGeneratorAppXamlFile>$(MSBuildThisFileDirectory)/App.xaml
    </ConstantGeneratorAppXamlFile>

    <ConstantGeneratorNameSpaceName>ourapp.Common
    </ConstantGeneratorNameSpaceName>
$(MSBuildThisFileDirectory)/Common/Constants.cs
$(MSBuildThisFileDirectory)/App.xaml
普通的
我想提供这样的东西

<Items>
  <Item XamlFile="$(MSBuildThisFileDirectory)/App.xaml" 
      NS="ourapp.Common" 
      OutputFile="$(MSBuildThisFileDirectory)/Common/Constants.cs" />

  <Item XamlFile="$(MSBuildThisFileDirectory)/Resources/AutomationIds.xaml" 
      NS="ourapp.Resources" 
      OutputFile="$(MSBuildThisFileDirectory)/Common/AutomationIds.cs" />
</Items>

有人能给我指出正确的方向吗?

您可以使用
在csproj文件中对项目进行分组,例如:

   <ItemGroup>
    <Xaml Include = "$(MSBuildThisFileDirectory)/App.xaml" >
      <NS>ourapp.Common</NS>
      <OutputFile>$(MSBuildThisFileDirectory)Common\Constants.cs</OutputFile>
    </Xaml>
  </ItemGroup>
<Project>
  <Target Name="message" AfterTargets="build">
    <Message Text="%(Xaml.OutputFile)"/>
  </Target>
</Project>
更新: cs文件:

public class Common : Task
{
    [Required]
    public ITaskItem[] SourceFiles
    {
        get
        {
            return sourceFiles;
        }
        set
        {
            sourceFiles = value;
        }
    }

    [Required]
    public string NS { get; set;}

    [Output]
    public ITaskItem[] temp { get; }

    private ITaskItem[] sourceFiles;

    public override bool Execute()
    {
        foreach (var item in SourceFiles)
        {
            Console.WriteLine(item.ToString());
        }

        Console.WriteLine(NS);
        Console.WriteLine("*************Common****************");
        return true;
    }
}
目标文件:

  <UsingTask TaskName="Common" AssemblyFile="C:\ClassLibrary1.dll" />
  
  <Target Name="taskdll" AfterTargets="build">
    
    <ItemGroup>
      <XamlFile Include ="$(MSBuildThisFileDirectory)/App.xaml">
        <NS>ourapp.common</NS>
        <OutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs</OutputFile>
      </XamlFile>

      <XamlFile Include ="$(MSBuildThisFileDirectory)/App.xaml">
        <NS>ourapp.Resources</NS>
        <OutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs</OutputFile>
      </XamlFile> 
      
    </ItemGroup>
    
    <Message Text="***************START************"/>
    <Common SourceFiles ="@(XamlFile);%(XamlFile.NS);%(XamlFile.OutputFile)"
        NS ="%(XamlFile.NS)" 
        Condition ="'%(XamlFile.NS)' == 'ourapp.common'"/>
    <Message Text="***************END*************"/>
  </Target>

普通的
$(MSBuildThisFileDirectory)/Common/Constants.cs
我们的应用程序资源
$(MSBuildThisFileDirectory)/Common/Constants.cs
我这边的结果是:


您想从当前状态更改什么?您在定义或传递
ConstantGeneratorSourceFiles
项(例如
)时遇到问题吗?我不确定如何在csproj中对项目进行分组,以及如何读取目标文件。@Jules,我已经更新了我的答案,希望它能对您有用。这是:您需要什么?如果不是,我想用一个例子来说明我的意思会更好。啊,是的,这很有帮助,尽管我希望有一个项目组的例子,但是另一个答案有t他包含属性,这会将它们视为实际文件。或者我可以包含字符串吗?是的,你可以包含字符串,它也可以工作。你介意更新你的答案吗?你可以添加两个项目组,显示两个不同的N并添加cs吗?只是为了完整性。