MSBuild:在定义自己的自定义属性时,如何访问内置属性?
我有一个名为MSBuild:在定义自己的自定义属性时,如何访问内置属性?,msbuild,visual-studio-2019,Msbuild,Visual Studio 2019,我有一个名为Common的文件。目标定义如下: “c:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp” “$(OutDir)…\TLB\$(TargetName).TLB” 当我检查TlbOutPath属性的输出时,它看起来像: "..\TLB\.tlb" 显然,$(OutDir)和$(TargetName)在属性组中使用时不会产生任何结果。我不知道为什么。如何使这些路径/值
Common的文件。目标定义如下:
“c:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp”
“$(OutDir)…\TLB\$(TargetName).TLB”
当我检查TlbOutPath
属性的输出时,它看起来像:
"..\TLB\.tlb"
显然,$(OutDir)
和$(TargetName)
在属性组中使用时不会产生任何结果。我不知道为什么。如何使这些路径/值可重用,同时在定义内置属性时仍能访问它们
我正在使用VisualStudio2019附带的MSBuild。我在实际的.csproj
项目中添加了一个Import
元素,以在需要的地方包含此目标。csproj
项目对项目使用SDK格式,例如
以下是导入的示例:
"..\TLB\.tlb"
MSBuild:在定义自己的属性时,如何访问内置属性
自定义属性
这是新sdk格式项目中的一个问题。我已经测试过了,得到了和你说的一样的问题,这让我很烦恼。像$(OutDir)
、$(TargetName)
、$(OutputPath)
、$(TargetPath)
和一些其他公共系统属性不能在新属性中使用,而$(配置)
和$(AssemblyName)
工作正常
不仅我们,还有其他人也面临着同样的问题
对于传统的旧csproj格式项目,以这种方式使用这些属性没有问题,但在新的SDK格式项目中,无法将一些常见属性(如$(OutDir)
、$(TargetName)
和$(TargetPath)
)分配给新属性。正如我们所知,大多数公共属性都是在Microsoft.common.props
文件(旧的csproj格式)中定义的,这与没有此类文件的新sdk格式项目大不相同
为了得到答案,我已经向DC论坛报告了这个问题。请参阅。您可以输入此链接并添加任何详细注释来描述此问题。任何对这个问题感兴趣的人也会投票,这样它会得到更多微软员工的关注。所有这些努力都将加速并得到最终答案
这个过程可能需要一段时间,或者你可以试试我的建议
建议
1)您可以在Common.targets
文件中自定义此属性$(OutDir)
,并使用$(TargetFramework)
而不是$(TargetName)
,因为$(TargetFramework)
是在xxxx.csproj
文件中定义的
<Project>
<PropertyGroup>
<OutDir>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName)\</OutDir>
<TlbExpPath>"c:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp"</TlbExpPath>
<TlbOutPath>"$(OutDir)..\TLB\$(TargetName).tlb"</TlbOutPath>
<TargetPath>xxxx\xxxx.dll(exe)</TargetPath>--------the absolute path of the output file
</PropertyGroup>
<Target Name="TlbExp" AfterTargets="CopyFilesToOutputDirectory" Inputs="$(TargetPath)" Outputs="$(TlbOutPath)">
<Exec Command='$(TlbExpPath) "$(TargetPath)" /nologo /win64 /out:$(TlbOutPath) /verbose' />
</Target>
</Project>
bin\$(配置)\$(目标框架)\$(程序集名称)\
“c:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp”
“$(OutDir)…\TLB\$(TargetName).TLB”
xxxx\xxxx.dll(exe)--输出文件的绝对路径
2)使用文件而不是自定义目标文件
A)您应该在项目文件夹下添加一个名为Directory.Build.targets
(它必须命名为this,并且有自己的规则导入到xxx.csproj
)的文件
B)在其中添加Common.targets
的内容,不做任何更改,然后直接构建项目。生成时,目录.Build.targets
将自动导入到项目中
此函数运行良好,不会丢失任何属性。不过,我还是不明白为什么它会起作用
结论
我认为#2更适合你,也更容易实现你的目标
MSBuild:在定义自己的属性时,如何访问内置属性
自定义属性
这是新sdk格式项目中的一个问题。我已经测试过了,得到了和你说的一样的问题,这让我很烦恼。像$(OutDir)
、$(TargetName)
、$(OutputPath)
、$(TargetPath)
和一些其他公共系统属性不能在新属性中使用,而$(配置)
和$(AssemblyName)
工作正常
不仅我们,还有其他人也面临着同样的问题
对于传统的旧csproj格式项目,以这种方式使用这些属性没有问题,但在新的SDK格式项目中,无法将一些常见属性(如$(OutDir)
、$(TargetName)
和$(TargetPath)
)分配给新属性。正如我们所知,大多数公共属性都是在Microsoft.common.props
文件(旧的csproj格式)中定义的,这与没有此类文件的新sdk格式项目大不相同
为了得到答案,我已经向DC论坛报告了这个问题。请参阅。您可以输入此链接并添加任何详细注释来描述此问题。任何对这个问题感兴趣的人也会投票,这样它会得到更多微软员工的关注。所有这些努力都将加速并得到最终答案
这个过程可能需要一段时间,或者你可以试试我的建议
建议
1)您可以在Common.targets
文件中自定义此属性$(OutDir)
,并使用$(TargetFramework)
而不是$(TargetName)
,因为$(TargetFramework)
是在xxxx.csproj
文件中定义的
<Project>
<PropertyGroup>
<OutDir>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName)\</OutDir>
<TlbExpPath>"c:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp"</TlbExpPath>
<TlbOutPath>"$(OutDir)..\TLB\$(TargetName).tlb"</TlbOutPath>
<TargetPath>xxxx\xxxx.dll(exe)</TargetPath>--------the absolute path of the output file
</PropertyGroup>
<Target Name="TlbExp" AfterTargets="CopyFilesToOutputDirectory" Inputs="$(TargetPath)" Outputs="$(TlbOutPath)">
<Exec Command='$(TlbExpPath) "$(TargetPath)" /nologo /win64 /out:$(TlbOutPath) /verbose' />
</Target>
</Project>
bin\$(配置)\$(目标框架)\$(程序集名称)\
“c:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\tlbexp”
“$(输出)