代码之家  ›  专栏  ›  技术社区  ›  jmucchiello

向msbuild添加新的目标类型:如何在任务规则中引用itemname?

  •  0
  • jmucchiello  · 技术社区  · 16 年前

    我正在尝试添加一个任务,以便在生成主DLL之后生成COM代理DLL。因此,我在.target文件中创建了以下内容:

    <Target Name="ProxyDLL"
          Inputs="$(IntDir)%(WHATGOESHERE)_i.c;$(IntDir)dlldata.c"
          Outputs="$(OutDir)%(WHATGOESHERE)ps.dll"
          AfterTargets="Link">
       <CL Sources="$(IntDir)%(WHATGOESHERE)_i.c;$(IntDir)dlldata.c" />
    </Target>
    

    <ItemGroup>
      <ProxyDLL Include="FTAccountant" />
    </ItemGroup>
    

    因此ftaccount.DLL文件是通过正常的构建过程创建的,当尝试编译代理存根时,它会创建以下命令行:

    cl /c dir\_i.c dir\dlldata.c
    

    当然,它找不到i.c。第一次尝试时,我将%(Filename)放在whatgoesher空间中,出现以下错误:

    C:\ActivePay\Build\Proxy DLL.targets(6,3): error MSB4095: The item metadata
    %(Filename) is being referenced without an item name.  Specify the item name by
    using %(itemname.Filename).
    

    所以我把它改为%(itemname.Filename),这是一个空字符串。如何获取任务的Include属性中指定的值并在任务中使用它?

    2 回复  |  直到 16 年前
        1
  •  0
  •   Julien Hoarau    16 年前

    必须指定要获取其值的元素:

    <ItemGroup>
      <COMProxy Include="FTAccountant" />
    </ItemGroup>
    
    <Target Name="ProxyDLL"
          Inputs="$(IntDir)%(COMProxy.Identity)_i.c;$(IntDir)dlldata.c"
          Outputs="$(OutDir)%(COMProxy.Identity)ps.dll"
          AfterTargets="Link">
       <CL Sources="$(IntDir)%(COMProxy.Identity)_i.c;$(IntDir)dlldata.c" />
    </Target>
    
        2
  •  0
  •   jmucchiello    15 年前

    我终于明白了。我需要在项目的项目标签上添加一个额外的目标:

    <Project Targets="Build;ProxyDLL" ...>
    

    上面的ProxyDLL目标从未工作过。因此,我只为代理DLL创建了一个单独的项目,并用MSBuild任务调用它。由于现在是从现有项目的上下文中调用,因此ProjectName变量可用:

    <Target Name="ProxyDLL"
            Inputs="$(MyPathVar)$(ProjectName)_i.c"
            Outputs="$(OutDir)$(ProjectName)ps.dll"
            AfterTargets="Link">
       <MSBuild Project="$(MyPathVar)$(ProjectName)ps.vcxproj" />
    </Target>