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

时间:2010-06-09 21:24:57

标签: visual-studio-2010 msbuild

我正在尝试在构建主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>

并将其从.vcxproj文件中引用为

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

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

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

当然找不到_i.c.第一次尝试,我把%(文件名)放在WHATGOESHERE空间,我收到了这个错误:

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 个答案:

答案 0 :(得分:0)

您必须指定所需值的元素:

<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>

答案 1 :(得分:0)

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

<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>