2013-06-04 24 views
5

Jak mogę przekazać niestandardową właściwość MsBuild do silnika kompilowanego Visual Studio z Visual Studio Extension (chcę napisać niestandardowy dodatek)? Podobnie jak Visual Studio przechodząc właściwości takie jak $(Configuration) i $(Platform), chciałbym dołączyć do procesu kompilacji i przekazać moją własność (np. $(MyCustomProperty) = "foobar"). Wiem, że można to osiągnąć przy użyciu linii poleceń MsBuild (/p:Property), ale chcę to zrobić z rozszerzenia.Przekazywanie niestandardowych właściwości projektu z Visual Studio Extension podczas kompilacji

Oto przykład tego, co chciałbym zrealizować: pole tekstowe na pasku narzędzi Visual Studio, w którym użytkownik może wpisać tekst - wartość, którą chciałbym przekazać, aby zbudować silnik.

Następnie w .csproj:

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

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

więc kierować AfterBuild będzie exectued tylko wtedy, gdy użytkownik wpisze DoAfterBuild w polu moje rozszerzenie za tekst

+0

Jak Visual Studio Extension wywołany msbuild? – Nicodemeus

+0

@NickCarlson - Nie chcę wywoływać MsBuild, ale pliki .csproj ARE MsBuild i Visual Studio przekazuje rzeczywiste wartości zmiennych $ (Platform) i $ (Configuration) podczas kompilacji. Chcę, aby wartość $ (MyOwnProperty) została przekazana do tego skryptu, więc mogę go użyć (np. ) –

+0

W swoim oryginalnym wpisie powiedziałeś chcesz móc zdefiniować własną własność poprzez rozszerzenie Visual Studio, ale teraz mówisz, że nie chcesz wywoływać MSBUILD. Czy piszesz własne rozszerzenie i chcesz zdefiniować własne niestandardowe właściwości? Być może próbka kodu pomoże zilustrować problem. – Nicodemeus

Odpowiedz

3

Można zażądać serwis IVsBuildPropertyStorage, ma następujące metody:

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

Coś takiego:

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(..); 

Więcej informacji: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.interop.ivsbuildpropertystorage.aspx

Powiązane problemy