visual-studio - 如何让 MSBuild 检测输出输入工具链依赖关系
问题描述
tl;博士
我将一个工具(MIDL)的输出作为输入添加到项目中的另一个工具(我的)。现在 MSBuild 不再正确跟踪 MIDL 输出。
很长的故事
我添加PIATest.idl
了一个 Visual Studio C++ 项目。该文件PIATest.tlb
使用 MIDL 编译成。如果我删除PIATest.tlb
并构建项目(不重新构建!),则 MIDL 会自动再次调用以构建缺少的PIATest.tlb
,如预期的那样。此后,该项目将保持最新状态。
现在我将它 PIATest.tlb
作为文件添加到项目中,因为我已经设置了 Visual Studio 属性页并构建了允许我自定义调用tlbimp.exe
以创建主互操作程序集的目标。这一切都很好;如果我编译 PIATest.tlb
然后tlbimp.exe
创建一个主互操作 dll,如果我修改PIATest.idl
然后 MIDL 并且tlbimp.exe
都以正确的顺序调用。
但是,如果我现在删除PIATest.tlb
,则不再重建。似乎因为PIATest.tlb
已添加到项目中,它已自动从 MIDL 工具的输出列表中删除。
Target Midl
不断报告“所有输出都是最新的”。
MSBuild 确实注意到项目包含一个不存在的文件 ( PIATest.tlb
),因此它将项目标记为过期并执行build
任务。但由于 MIDL 不会重新创建 TLB 文件,它只会继续TlbImp
执行因缺少输入而失败的任务。
问题:如何告诉 MIDL/MSbuild 继续将PIATest.tlb
其视为输出?
下面是我导入到项目中以添加Primary Interop Assembly工具链的文件。为了这篇文章的简单起见,这些省略了所有参数tlbimp.exe
,只是创建了一个假的互操作 dll。
PrimaryInteropAssembly.xml
<?xml version="1.0" encoding="utf-8"?>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">
<ItemType Name="PrimaryInteropAssembly" DisplayName="Primary Interop Assembly"/>
<ContentType Name="PrimaryInteropAssembly" ItemType="PrimaryInteropAssembly" DisplayName="Primary Interop Assembly"/>
<FileExtension Name=".tlb" ContentType="PrimaryInteropAssembly"/>
</ProjectSchemaDefinitions>
PrimaryInteropAssembly.targets
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema Include="$(MSBuildThisFileDirectory)PrimaryInteropAssembly.xml" />
<AvailableItemName Include="PrimaryInteropAssembly">
<Targets>TlbImp</Targets>
</AvailableItemName>
</ItemGroup>
<Target Name="TlbImp" Condition="'@(PrimaryInteropAssembly)' != ''" BeforeTargets="AfterMidl">
<ItemGroup>
<PrimaryInteropAssembly>
<Command>type %(Identity) > %(Filename).interop.dll</Command>
<Outputs>%(Filename).interop.dll</Outputs>
</PrimaryInteropAssembly>
</ItemGroup>
<CustomBuild
Sources="@(PrimaryInteropAssembly)"
MinimalRebuildFromTracking="true"
TrackerLogDirectory="$(TLogLocation)"
ErrorListRegex="(?'FILENAME'.+):(?'LINE'\d+):(?'COLUMN'\d+): (?'CATEGORY'error|warning): (?'TEXT'.*)" />
</Target>
</Project>
编辑
经过一番挖掘,我得出结论,罪魁祸首在于 Visual Studio 的 UpToDateChecker。它会删除或不再将.tlb
文件添加到工具的输出中midl
;因此没有调用 midl。所以我提交了一个错误报告。
有人知道如何通过修改来解决这个问题PrimaryInteropAssembly.targets
吗?
解决方案
推荐阅读
- python - 调整由 django 通用编辑视图生成的表单
- hive - 如果条件匹配,HiveQL 查询以查找行之间的增量
- c# - 下拉列表将所选项目列出到 Html 按钮超链接值
- python-3.x - 代码在同一个线程但不同的进程上执行
- javascript - js中如何覆盖合并两个对象?
- linux - 无法在 tmp 中创建目录(overthewire bandit24)
- wpf - Xaml 在 TextBlock 和 TextBox 之间切换
- machine-learning - k-means 聚类数据:如何标记新传入的数据
- java - 我在 raspberrypi3 上使用 Java fx 运行了一个 jar 文件,但没有输出背景图像 gif
- pandas - Pandas 用另一个数据框更新一个数据框