У нас есть один файл AssemblyInfoGlobal.cs на уровне решения, как и другие ответы. Затем мы имеем в качестве части нашего сценария сборки небольшое приложение, которое принимает CCNetLabel, который определен CruiseControl.net (и использует defaultLabeller для генерации меток), и извлекает глобальный файл, изменяет номер версии, а затем проверяет глобальный файл обратно в .
Некоторые из наших проектов имеют несколько решений, поэтому глобальный файл находится выше уровня решения в структуре каталогов, достаточно высоко, чтобы все, что ему нужно, находилось ниже него.
Затем мы также обновляем номера версий проектов развертывания - номера для них находятся в файле VDProj, но я не уверен, что вы найдете их в экспресс-версиях - я думаю, что это полная версия Professional вверх. И некоторые проекты имеют дюжину проектов развертывания, но нет простого способа извлечения номера версииf из самого файла VDPROJ. (или есть?)
Затем происходит сборка, что означает, что все выходные данные из сборки имеют одинаковый номер версии, в любой момент мы можем получить версию из MSI или сборки, и мы точно знаем, какой источник использовался для создания этого вывода.