Я обошел это с помощью программы-оболочки для mt.exe
, которая перезапускала ее до тех пор, пока она не преуспела. Сохраните следующий код как mt-wrapper.cpp
:
#include <windows.h>
#include <stdio.h>
#include <process.h>
// Build from a Visual Studio Command Prompt with "cl /O2 /Gy /Femt.exe mt-wrapper.cpp"
int __cdecl wmain(int argc, WCHAR **argv, WCHAR **env)
{
// Stop outputting text.
fclose(stdout);
fclose(stderr);
// Run the original mt.exe, which has been renamed to mt-orig.exe .
for (;;)
{
// Try to run the original mt.
intptr_t iStatus = _wspawnve(_P_WAIT, L"C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\mt-orig.exe", argv + 1, env);
if (iStatus == 0)
break;
// Try again, after a short wait.
::Sleep(100);
}
return 0;
}
Создайте эту программу, перейдите в папку C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
, переименуйте старую mt.exe
в mt-orig.exe
(и mt.exe.config
в mt-orig.exe.config
) и поместите эту программу-оболочку в mt.exe
. Теперь, когда вы строите, он будет пытаться запустить исходный mt.exe
, пока не добьется успеха.
Как ни странно, MSBuild, похоже, не проверяет нулевой статус, когда решает, что mt.exe
успешно & mdash; похоже, он ищет сообщения об ошибках, записанные в stdout / stderr. Таким образом, эта программа закрывает оба из них, прежде чем создать оригинальную mt.exe
. Любой, кто чувствует себя трудолюбивым, может применить найденный совет здесь , чтобы сохранить результат успешного запуска оригинального mt.exe
и вывести его в stdout / stderr.