Я не знаю, как программно получить доступ к "$ (TargetPath)", я согласен, что это могло бы быть лучшим решением.
Однако упомянутый вами подход все же должен быть работоспособным, поскольку свойство OutputPath относится к папке, в которой находится файл проекта. (Пожалуйста, дайте мне знать, если я пропускаю какой-то сценарий, где это не так?)
Так что вы можете сделать что-то похожее на это:
private static string GetProjectExecutable(Project startupProject, Configuration config)
{
string projectFolder = Path.GetDirectoryName(startupProject.FileName);
string outputPath = (string)config.Properties.Item("OutputPath").Value;
string assemblyFileName = (string)startupProject.Properties.Item("AssemblyName").Value + ".exe";
return Path.Combine(new[] {
projectFolder,
outputPath,
assemblyFileName
});
}
(перегрузка Path.Combine, используемая здесь, доступна только в .NET 4.0, но вы всегда можете ее перенести)