在执行任务中使用program.exe 之前确定它是否可用?

jww*_*jww 5 msbuild msbuild-task visual-studio

根据微软的Exec Task,它通过使用指定的参数来运行指定的程序或命令:

命令- 必需的字符串参数。

要运行的命令。这些可以是系统命令(例如 attrib),也可以是可执行文件(例如 program.exe、runprogram.bat 或 setup.msi)。

该参数可以包含多行命令。或者,您可以将多个命令放入批处理文件中并使用此参数运行它。

我们目前正在使用CustomBuild类似以下的内容:

<CustomBuild Condition="'$(Platform)'=='Win32'" Include="rdrand.asm">
    <Message>Building and assembling rdrand.asm</Message>
    <Command>ml.exe /c /nologo /D_M_X86 /W3 /Cx /Zi /safeseh /Fo"$(IntDir)rdrand-x86.obj" "%(FullPath)"</Command>
    <Outputs>$(IntDir)\rdrand-x86.obj;%(Outputs)</Outputs>
 </CustomBuild>
Run Code Online (Sandbox Code Playgroud)

我们希望切换到 NASM 和 Exec Task,因为它为 Windows 和 Linux 提供了一组源。它还允许我们在适当的时候为 Windows 手机和平板电脑提供 ASM,例如PMULLPMULL2如果 NASM 不可用,那么我们将使用备用 C/C++ 实现。

注意:我们不希望用户做任何事情。我们不希望他们选择某些内容,也不希望他们设置定义。要求用户做某事意味着我们必须回答用户的问题。我们希望事情对用户来说“正常工作”;F5对于用户而言,在 Visual Studio 下应该“正常工作”。

我的第一个问题是,Exec Task 是适合这项工作的工具吗?我的第二个问题是,我们如何确定nasm.exeMSBuild 中是否可用?在这里,“可用”意味着它的路径,所以我们可以调用它。

sti*_*ijn 5

很难确定 Exec 是否是正确的工具,但它绝对是调用外部程序的方法,所以我想它在这里完全可用。

在这里,“可用”意味着它的路径,所以我们可以调用它。

最好确保它可以被调用(例如,不缺少依赖项,并且在 32 位计算机上不是 64 位),而不仅仅是是否找到它。执行此操作的标准方法:只需尝试运行它:

<Target Name="CheckNasmIsCallable">
  <!-- Redirect standard output to avoid clutter, IgnoreExitCode
       as this is just a check so should not lead to actual errors. -->
  <Exec Command="nasm.exe -h > NUL" IgnoreExitCode="True">
    <Output TaskParameter="ExitCode" PropertyName="NasmExitCode" />
  </Exec>
</Target>

<Target Name="WantsToRunNasm" DependsOnTargets="CheckNasmIsCallable">
  <Message Text="Nasm found" Condition="'$(NasmExitCode)' == '0'" />
  <Message Text="Nasm not found" Condition="'$(NasmExitCode)' != '0'" />
</Target>
Run Code Online (Sandbox Code Playgroud)