Я создаю тестовый проект (CxxTest) с помощью Visual Studio и сразу же выполняю его через событие после сборки. Это работает и так уже давно. Теперь у меня другое поведение при выполнении в событии после сборки по сравнению с выполнением вручную из командной строки. Следующий код ведет себя иначе в событии после сборки по сравнению с запуском exe вручную или с помощью отладчика Visual Studio:
// getValueFromStruct returns empty string when executed
// as post build event, but returns correct value when executed manually
std::string expectedValue1("Val_1");
TS_ASSERT_EQUALS(expectedValue1, getValueFromStruct(res1));
Это вспомогательная функция называется:
std::string getValueFromStruct(tResult pResult)
{
std::string result = "";
if (pResult.pCharDetails != NULL)
{
for (int i=0; i < pResult.iNumResults; i++)
{
result.append(1, static_cast<char>(pResult.pCharDetails[i].wChar1));
}
}
// also the cout of the result is empty when executed from
// build event, but is filled with data when in shell
std::cout << ++callCount << " : " << result<< std::endl;
return result;
}
Кажется, проблема возникает только тогда, когда getValueFromStruct (tResult) вызывается для более чем одного экземпляра tResult в одном и том же методе.
Есть ли различия между средой, библиотекой времени выполнения или чем-то еще между этими двумя способами? Visual Studio управляет средой командной строки для события сборки?
Вопрос возникает в Только релиз и режим x64. И это происходит только на моей машине, а не на сервере сборки. Но это также возникает при сборке на моей машине через скрипт сборки, как это делает сервер.
Я нашел 3 способа обойти проблему:
Но это не объясняет, почему он ведет себя по-разному в событиях сборки и обычной командной строке.
Задача ещё не решена.
Других решений пока нет …