我想使用 Powershell 运行构建后脚本。该脚本需要在 64 位下运行。但是,每当我使用 .csproj 文件运行 msbuild 时,脚本始终以 32 位运行。如果我从启动 msbuild 的同一个 powershell 会话运行相同的脚本,则该脚本可以在 x64 中正常运行。
我的命令:
msbuild .\src\Project.csproj /t:Build /p:Platform='x64' /p:Configuration='Debug'
我想我可以强制使用64位版本,就像这个post所建议的那样 我的 .csproj 文件中的目标:
<PropertyGroup>
<PowerShellExe>$(WINDIR)\system32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
</PropertyGroup>
<Target Name="AfterBuild">
<Exec Command="$(PowerShellExe) .\Run-AfterBuild.ps1" WorkingDirectory="$(OutputPath)"/>
</Target>
构建后脚本的开头:
Write-Host $"Is a 64bitsProcess $([System.Environment]::Is64BitProcess)"
从 msbuild 运行时,输出为 false,而从启动 msbuild 但运行脚本的会话中直接输出 true。
MS 构建版本:16.3
64 位与 32 位进程 请参阅 单独的、特定于位的目录,如
C:\Windows\System32
。
因此,当从 32 位进程启动时,
$(WINDIR)\System32\WindowsPowerShell\v1.0\powershell.exe
指的是 32 位版本的 PowerShell。
但是,有一个虚拟[1]
SysNative
目录,它允许32位进程访问64位System32目录:[2]
$(WINDIR)\SysNative\WindowsPowerShell\v1.0\powershell.exe
为了完整起见:对于逆,即允许64位进程访问32位System32目录,请使用(非虚拟)
SysWOW64
目录。
[1] 当枚举
C:\Windows\System32
的子目录时,会显示noSysNative
条目。但是,使用它作为路径的一部分,例如C:\Windows\SysNative\WindowsPowerShell\v1.0\powershell.exe
,透明地针对 32 位进程不可见的 64 位 System32 目录。
[2] 请注意,此虚拟目录仅对 32 位 进程可见。从 PowerShell 会话内部,引用 64 位 SYSTEM32 目录的与位无关的方法是:
"$env:windir\" + ('SysNative', 'System32')[[Environment]::Is64BitProcess]