我正在尝试在构建主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属性中指定的值并在任务中使用它?
答案 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>