Visual Studio后构建事件MT.exe命令失败,错误代码为9009。

13

你好,我正在从我的发布后事件中运行以下命令:

C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"

执行时出现代码9009退出错误... 我不明白为什么会发生这种情况,有什么建议吗?


可能是重复的问题:在构建过程中,“exited with code 9009”是什么意思? - Michael Freidgeim
5个回答

18
尝试在mt.exe路径周围添加引号,例如:

"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe"

另外,请确保该路径是有效的。

希望这可以帮到您。我已经花了一整天时间解决错误代码9009,使用完整的带引号路径似乎可以解决问题。


10

错误代码 9009 表示文件未找到。在后置生成命令的路径中存在空格会导致在命令提示符中出现错误,除非您在整个路径和可执行文件名称周围加上引号。基本上,在您的后置生成命令中,它正在尝试执行 C:\Program,并带有以下参数:

  • Files\Microsoft
  • SDKs\Windows\v7.0A\bin\mt.exe
  • -manifest "$(ProjectDir)$(TargetName).exe.manifest"
  • -updateresource:"$(TargetDir)$(TargetName).exe;#1"

由于显然您的根目录中没有名为 Program 的文件,因此此命令将失败。在引号中封装路径和可执行文件将导致整个表达式作为单个命令进行评估,因此如果您更改后置构建命令为以下内容,则应该一切正常:

"C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"

或者在 Windows x64 上使用 VisualStudio x86

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\mt.exe"

这个答案比得到更多赞同的答案好很多。并不是所有的“文件未找到”错误都与引号有关。感谢您的回答。 - Russell Steen
1
还要确保运行构建的用户可以访问文件系统位置。 - PW Kad

1

这里有一个潜在的解决方案:

您可以使用Visual Studio的Post build事件功能来执行此操作,输入以下命令:mt.exe -manifest app.manifest -outputresource:myapplication.exe;#1。这可能不起作用,Visual Studio会给出类似“...以代码9009退出...”的错误。

您需要使用例如记事本编辑csproj文件并取消注释与Target Name =“AfterBuild”相关的XML标记(通常可以在文件末尾找到它们)。然后,将与PostBuildEvent相关的标记放置在与AfterBuild相关的标记中,然后重新加载项目并编译。它将生成一个需要使用管理员权限执行的.exe文件。


1

在阅读本主题之前,我愚蠢地认为VS会知道mt.exe的位置。+1给@james

由于当前SDK没有内置宏,我依靠系统变量windowssdkdir

 "%windowssdkdir%\bin\mt.exe"

我的电脑没有定义这样的环境变量。 - StayOnTarget
@DaveInCaz,其他人也报告了缺失的envar。至于我的答案,我是指一个大约6年前投入使用的Windows 7工作站。我不记得envar是如何设置的。 - bvj
虽然我没有那个特定的环境变量,但我同意我也曾经假设你可以根据这篇文章在后期构建事件中使用mt.exe:https://msdn.microsoft.com/en-us/library/bb756929.aspx - Rachel Martin

0
在Visual Studio中的后构建脚本是使用机器的默认路径设置来执行的,而不是在VS开发者提示符中使用的设置。在后构建脚本文本框的开头插入以下行以初始化VS Dev Prompt环境:
call "$(DevEnvDir)..\Tools\vsdevcmd.bat"

之后,可以使用诸如MT.EXE之类的工具而无需指定路径,例如:
call "$(DevEnvDir)..\Tools\vsdevcmd.bat"
mt.exe -manifest "$(ProjectDir)$(TargetName).exe.manifest" -updateresource:"$(TargetDir)$(TargetName).exe;#1"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接