1

我有一个 Visual Studio 项目,其启动操作设置为在 PowerShell 中加载 DLL,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Platform)' == 'Debug|x86'">
    <StartAction>Program</StartAction>
    <StartProgram>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe</StartProgram>
    <StartArguments>-NoProfile -NoExit -Command Add-Type -Path  "Foo.dll" -PassThru | Select FullName</StartArguments>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
    <StartAction>Program</StartAction>
    <StartProgram>c:\windows\system32\windowspowershell\v1.0\powershell.exe</StartProgram>
    <StartArguments>-NoProfile -NoExit -Command Add-Type -Path  "Foo.dll" -PassThru | Select FullName</StartArguments>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <StartProgram>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe</StartProgram>
    <StartArguments>-NoProfile -NoExit -Command Add-Type -Path  "Foo.dll" -PassThru | Select FullName</StartArguments>
    <StartAction>Program</StartAction>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
    <StartProgram>c:\windows\system32\windowspowershell\v1.0\powershell.exe</StartProgram>
    <StartArguments>-NoProfile -NoExit -Command Add-Type -Path  "Foo.dll" -PassThru | Select FullName</StartArguments>
    <StartAction>Program</StartAction>
  </PropertyGroup>
</Project>

我将文件手动编辑为以下内容以消除冗余:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup '$(Platform)' == 'x86'">
    <StartProgram>C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe</StartProgram>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Platform)' == 'AnyCPU' or Condition="'$(Platform)' == 'x64'">
    <StartProgram>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</StartProgram>
  </PropertyGroup>
  <PropertyGroup>
    <StartAction>Program</StartAction>
    <StartArguments>-NoProfile -NoExit -Command Add-Type -Path  "Foo.dll" -PassThru | Select FullName</StartArguments>
  </PropertyGroup>
</Project>

现在我想用“$(TargetPath)”之类的东西替换硬编码的“Foo.dll”。但是,计算结果为空字符串。以下也解析为空字符串:

  • $(程序集名称)
  • $(TargetName)$(TargetExt)
  • $(目标文件名)

设置值<StartArguments>-NoProfile -NoExit -Command Add-Type -Path "$(Platform)" -PassThru | Select FullName</StartArguments>确实会创建命令行"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -NoExit -Command Add-Type -Path "x64" -PassThru | Select FullName

4

1 回答 1

2

在所有 Import 指令之后移动您的属性声明,例如<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

$(TargetPath) 最初是在 Microsoft.Common.targets 中定义的,因此在将该文件导入脚本之前,它不会包含任何值。如果您的属性在导入之前(以及在导入的属性出现之前)定义 - 在自上而下的属性评估阶段,未定义的属性将被解析为空字符串。

注意:我错误地没有注意到您的意思是 proj* .user * 文件,而不是原始 .proj 文件。我不知道 Visual Studio 何时加载 .user 文件以及加载期间设置的上下文。您可以尝试使用原始 .targets 文件中的定义。这就是在 Microsoft.common.targets 中定义 TargetDir 的方式: <TargetDir Condition="'$(OutDir)' != ''">$([MSBuild]::Escape($([System.IO.Path]::GetFullPath($([System.IO.Path]::Combine( $(MSBuildProjectDirectory), $(OutDir)))))))</TargetDir>

如果 .user 文件在没有任何先前构建上下文的情况下加载 - 它仍然无法正确解析 $(OutDir)。所以这仍然是您问题的不完整答案=(

于 2012-10-08T06:46:09.120 回答