2015-07-02 6 views
1

Я работаю над пользовательской системой проектов, которая основана на MPF. Для сборки я определил пользовательский целевой файл, который определяет минимальный набор требуемых целей, таких как Build, Clean и Rebuild, чтобы проект прекрасно сочетался с IDE Visual Studio; например, я могу вызвать сборку для загруженного проекта, используя F6 ярлык, в результате чего ярлык Ctrl + F5 также должен запускать приложение, если сборка прошла успешно. Но, нет ... результат сборки выводит успех, но Visual Studio не пытается запустить приложение? Я хотел бы знать, что не хватает ...Visual Studio не запускает вывод сборки

Мой пользовательский файл проекта не импортирует Microsoft.Common.targets, так как это не управляемый lanugage, и большинство материалов, предоставляемых общей целью сборки, просто не применимы к моему проекту (также я хотел бы поддерживать интеграцию MSBuild как можно более тонкой).

Я прочитал документацию по адресу: https://msdn.microsoft.com/en-us/library/vstudio/ms171468(v=vs.110).aspx; в разделе «Отладка» упомянуты следующие свойства MSBuild: OutputPath, AssemblyName и OutputType; мой настраиваемый целевой объект Build задает все эти свойства, поэтому я предположил, что Visual Studio знает все, что требуется для запуска моего приложения (конечно, даже если мой языковой сервис еще не поддерживает отладку).

Build цель определение выглядит следующим образом ...

<Target Name="Build" 
     DependsOnTargets="PrepareBuildProperties" 
     Returns="$(TargetPath)"> 
</Target> 

Я посмотрел на файл Microsoft.Common.targets и нашел Run цели, а также. Комментарий говорит ...

Выполнить окончательный вывод сборки, если это .EXE

и подмигнули в основном делают это (это сокращенный вариант оригинального целевого определения) .. .

<Target Name="Run" 
     DependsOnTargets="$(RunDependsOn)"> 
    <Exec Command="$(TargetPath) $(StartArguments)" 
      WorkingDirectory="$(OutDir)" /> 
</Target> 

если Visual Studio назвать эту цель, если я выбираю Start without debugging команду из меню Debug или нажмите Ctrl + F5 ?

ответ

-1

Прежде всего, это утверждение:

Мой пользовательский файл проекта не импортирует Microsoft.Common.targets, поскольку подмигнули не управляемый lanugage

не имеет особого смысла поскольку любой язык может использовать файлы MSBuild .Targets, а не только управляемые языки. Например, создание проектов VC++ в значительной степени зависит от таких файлов. Теперь вернемся к проблеме.

сборка выходных сигналов успешна, но Visual Studio не пытается запустить приложение? Я хотел бы знать, что не хватает

Современные версии Visual Studio не имеют ничего общего с проектами построения или запуском выходных файлов. MSBuild управляет всем процессом.Вы должны указать где-нибудь, что вам нужен какой-нибудь файл, который будет выполнен после создания проекта.

Вы можете использовать AfterBuild target, чтобы указать задачу, которую необходимо выполнить после завершения сборки. Этот тег входит в тег проекта файла проекта. Вы также можете указать условия, чтобы задача выполнялась только тогда, когда они были выполнены.

Другим способом является использование пользовательских шагов сборки, как описано в here. Этот метод является более гибким.

Существует третий способ, но, вероятно, наименее предпочтительный. Вы можете использовать события пост-сборки. Для того, чтобы определить событие после сборки, добавьте это под тегом проекта:

<PropertyGroup> 
    <PostBuildEvent> task command goes here </PostBuildEvent> 
</PropertyGroup> 

Проблема с этим в том, что он появится на вкладке События построения свойств проекта и поэтому пользователь может увидеть его и потенциально изменить его , События post build предназначены для использования пользователем, а не средой IDE.

Тег Exec, который вы упомянули, представляет собой встроенную задачу, указывающую, что содержимое тега должно интерпретироваться как командная строка, которая должна быть выполнена. Три описанных выше метода - это абстракции в верхней части задачи Exec. Эта задача выполняется, когда вы нажимаете Start without debugging.

+0

Прежде всего, спасибо за усилия, которые вы вложили в свой ответ ... но на самом деле это действительно не помогает. У меня нет проблем с пониманием того, как работает MSBuild и как я могу его расширить. В самом деле, расширение моего языка - неуправляемый язык, такой как C или C++; система проекта, конечно, основана на MSBuild. Я создал пользовательский целевой файл, который вызывает компилятор командной строки с использованием 'Exec' - и пока сборка просто отлично работает ... – Matze

+0

@Matze Я упомянул три метода для запуска вывода проекта, что и есть то, что вы просили. Вы пробовали кого-то из них, и это не сработало? Кроме того, поскольку вам нравится поддерживать интеграцию MSBuild как можно более тонкой, создание целевого файла цели не подходит для этой цели. Все методы, о которых я говорил, не нуждаются в файле целей, они основаны только на файле проекта, который уменьшает интеграцию MSBuild. –

+0

Все три метода не применяются к этой конкретной проблеме. Причина, по которой у меня есть отдельный файл целей, заключается в том, что сам файл проекта только объявляет, ЧТО необходимо построить; вместо целевых файлов определяют, КАК проект строится. Итак, я просто разделяю озабоченность; как Microsoft делает с их целями. Как я объяснил, в моем файле целевых целей определяются такие цели, как «Чистый», «Строить», «Восстановить» и т. Д .; Visual Studio находит и называет их, как ожидалось. Единственное, что мне не нужно, это команда «Run»; или, по крайней мере, я не знаю, какую цель ожидать от Visual Studio ... – Matze