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”
“$(输出)