2013-06-04 3 views
5

Как передать пользовательское свойство MsBuild в механизм сборки Visual Studio из Visual Studio Extension (я хочу написать пользовательскую надстройку)? Так же, как и сама Visual Studio передает свойства, такие как $(Configuration) и $(Platform), я хотел бы приложить к процессу сборки и передать свое собственное свойство (например, $(MyCustomProperty) = "foobar"). Я знаю, что это можно сделать с помощью командной строки MsBuild (/p:Property), но я хочу сделать это из расширения.Передача пользовательских свойств проекта из Visual Studio Extension во время сборки

Вот пример того, что я хотел бы сопровождать: текстовое поле на панели инструментов visual studio, где пользователь может ввести текст - значение, которое я хотел бы передать в механизм сборки.

Тогда в .csproj:

<PropertyGroup> 
    <MyCustomProperty Condition=" '$(MyCustomProperty)' == '' ">DefaultValue</MyCustomProperty> 
</PropertyGroup> 

<Target Name="AfterBuild" Condition=" '$(MyCustomProperty)' = 'DoAfterBuild' "> 
    ... 
</Target> 

Так цель AfterBuild будет exectued только если пользователь ввел DoAfterBuild в текстовом поле моего внутреннего абонента

+0

Как Visual Studio Extension вызывается MSBuild? – Nicodemeus

+0

@NickCarlson - я не хочу ссылаться на файлы MsBuild, но .csproj. Сценарии MsBuild и Visual Studio передают фактические значения переменных $ (Platform) и $ (Configuration) во время сборки. Я хочу иметь значение $ (MyOwnProperty), переданное этому скрипту, поэтому я могу его использовать (например, ) –

+0

В вашем исходном сообщении вы сказали вы хотите определить свое собственное свойство с помощью расширения Visual Studio, но теперь вы говорите, что не хотите вызывать MSBUILD. Вы пишете собственное расширение и хотите определить свои собственные пользовательские свойства? Возможно, образец кода поможет проиллюстрировать проблему. – Nicodemeus

ответ

3

Вы можете запросить обслуживание IVsBuildPropertyStorage, он имеет следующий метод:

SetPropertyValue Used by a project subtype to set an MSBuild property value. 

Что-то вроде этого:

EnvDTE.Project proj = ...; 
var sol = Package.GetGlobalService(typeof(VsSolution)) as IVsSolution; 
IVsHierarchy hier; 
sol.GetProjectOfUniqueName(p.UniqueName, out hier); 
var storage = hier as IVsBuildPropertyStorage; 
storage.SetPropertyValue(..); 

Дополнительная информация: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsbuildpropertystorage.aspx