Существует простой способ (хотя и не самый удачный) с использованием специального внешнего инструмента.
Предполагается, что файл вашего проекта имеет следующую модификацию:
<Target Name="CalledFromIde">
<Error Text="Called from the IDE!" />
</Target>
Перейти к инструментам |Внешние инструменты и добавьте один из них следующим образом:
Title: Called from IDE
Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
Arguments: $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
Initial directory: $(ProjectDir)
Use Output window: checked
Выполнение этого приводит к выводу:
Build FAILED.
"F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
(CalledFromIde target) ->
F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!
Вы обращаетесь к MSBuild как к внешнему инструменту и запускаете егоцель непосредственно.Вы должны указать полный путь к MSBuild, поскольку IDE не поддерживает те свойства, которые доступны в создаваемой им среде компоновки.
Вы можете подключить это к ярлыку, выяснив, какая команда # этов наборе Tools.ExternalCommand #.
Если вы ищете решение с большей сложностью, оно немного сложнее.Вкратце (для VS2010):
1) Создайте надстройку VS (Файл | Новый | Проект | Другие типы проектов | Расширяемость | Надстройка Visual Studio).Я не уверен, что для этого необходимо установить VS SDK, он доступен в диспетчере расширений.
Выберите в мастере следующие параметры: - Microsoft Visual Studio 2010 - Да, создайтеПункт меню «Инструменты» - загрузка при запуске приложения. Моя надстройка никогда не будет отображать модальный пользовательский интерфейс и может использоваться со сборками командной строки.
2) Добавить ссылки на Microsoft.Build и Microsoft.Build..Framework
3) Найдите реализацию Exec в файле Connect.cs
4) Замените ее следующим кодом:
public void Exec(
string commandName,
vsCommandExecOption executeOption,
ref object varIn,
ref object varOut,
ref bool handled)
{
handled = false;
if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
return;
if (commandName != "BuildAddin.Connect.BuildAddin")
return;
var doc = _applicationObject.ActiveDocument;
var projectItem = doc.ProjectItem;
var project = projectItem.ContainingProject;
var evalProject =
Microsoft.Build.Evaluation.ProjectCollection
.GlobalProjectCollection.LoadProject(project.FullName);
var execProject = evalProject.CreateProjectInstance();
bool success = execProject.Build("CalledFromIde", null);
var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
var output = (OutputWindow)window.Object;
OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");
handled = true;
return;
}
5) Лучшая настраиваемая цельво время отладки, поскольку предыдущая ошибка:
<Target Name="CalledFromIde">
<WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
</Target>
6) В приведенном выше коде нет проверки ошибок для краткости, вам нужно быть намного чище, так как он будет работать в IDE.Надстройка поместит пункт меню в меню «Инструменты».Как написано выше, он просто ищет проект, содержащий активный в данный момент документ редактора, который потребует более качественного соединения для всего, что вы готовите.
Этот метод получает экземпляр механизма сборки из IDE и имеет еговыполнить сборку на отдельном экземпляре проекта.