2017-10-03 84 views
9

Mam nowy plik projektu w stylu csproj, który zastępuje IntermediateOutputPath. Wygląda to tak:Jak uzyskać IntermediateOutputPath z rozszerzenia Visual Studio i nowego formatu csproj

<PropertyGroup> 
    <TargetFramework>netstandard1.6</TargetFramework> 
    <IntermediateOutputPath>new\path\to\obj</IntermediateOutputPath> 
</PropertyGroup> 

Problem polega na tym, moja wizualna rozszerzenie Studio nie może uzyskać dostępu IntermediateOutputPath nieruchomości. Project.Properties wydaje się mieć o wiele mniej rzeczy w porównaniu do starego formatu projektu.

Próbowałem również project.ConfigurationManager.ActiveConfiguration.Properties z podobnym sukcesem.

Czy istnieje sposób na uzyskanie tych informacji z rozszerzenia Visual Studio?

+0

Can udostępniasz przykładowy projekt na github.com, który może debugować? –

+0

Nie ma zbyt wiele kodu do udostępnienia. Zasadniczo tworzysz przykładowe rozszerzenie Visual Studio VSIX. W rozszerzeniu pobierzmy obiekt 'DTE' taki jak ten' var dte = (DTE) GetService (typeof (SDTE)); 'Następnie, podczas debugowania twojego nowego rozszerzenia, możesz uzyskać dostęp do Rozwiązania i wyliczyć jego 'Projekty. Wcześniej mogłem odczytać wszystkie właściwości MSBuild, ale już nie. – ionoy

+0

Mam całą konfigurację, ale nie mogę ustawić tej opcji? Jak to ustawić? Ręczne dodanie go powoduje błąd podczas ładowania projektu –

Odpowiedz

3

Więc stworzyłem proste rozszerzenie, aby wydrukować wszystkie właściwości

private string GetPropertiesString(Properties properties) 
    { 
     StringBuilder test = new StringBuilder(); 
     foreach (Property property in properties) 
     { 
      try 
      { 
       test.AppendLine(property.Name + ":=" + property.Value.ToString()); 
       Console.WriteLine(property.Name + ":=" + property.Value.ToString()); 
      } 
      catch (Exception ex) 
      { 
       var x = ex.Message; 
      } 
     } 

     return test.ToString(); 
    } 

    private void MenuItemCallback(object sender, EventArgs e) 
    { 
     DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2; 
     var sol = dte2.Solution; 
     var projs = sol.Projects; 
     foreach (var proj in sol) 
     { 
      var project = proj as Project; 
      var rows = project.ConfigurationManager.ConfigurationRowNames as IEnumerable<object>; 
      foreach (var row in rows) 
      { 
       var config = project.ConfigurationManager.ConfigurationRow(row.ToString()).Item(1) as Configuration; 
       string configs = GetPropertiesString(config.Properties); 
      } 
     } 
    } 

I to dało poniżej wyjścia

LanguageVersion:= 
RunCodeAnalysis:=False 
NoStdLib:=False 
ErrorReport:=prompt 
CodeAnalysisUseTypeNameInSuppression:=True 
CodeAnalysisInputAssembly:=bin\Debug\WindowsFormsApp1.exe 
CodeAnalysisDictionaries:= 
GenerateSerializationAssemblies:=2 
CodeAnalysisModuleSuppressionsFile:=GlobalSuppressions.cs 
StartWorkingDirectory:= 
Optimize:=False 
DocumentationFile:= 
StartPage:= 
OutputPath:=bin\Debug\ 
TreatWarningsAsErrors:=False 
EnableASPDebugging:=False 
IncrementalBuild:=True 
CodeAnalysisFailOnMissingRules:=False 
CodeAnalysisLogFile:=bin\Debug\WindowsFormsApp1.exe.CodeAnalysisLog.xml 
DefineConstants:=DEBUG;TRACE 
UseVSHostingProcess:=True 
StartProgram:= 
DefineDebug:=False 
CodeAnalysisIgnoreBuiltInRules:=True 
CodeAnalysisRuleSetDirectories:=;F:\VS2017\Team Tools\Static Analysis Tools\\Rule Sets 
CodeAnalysisCulture:= 
CodeAnalysisOverrideRuleVisibilities:=False 
CodeAnalysisRuleAssemblies:= 
DefineTrace:=False 
DebugSymbols:=True 
CodeAnalysisIgnoreBuiltInRuleSets:=True 
CodeAnalysisRuleSet:=MinimumRecommendedRules.ruleset 
NoWarn:= 
CodeAnalysisIgnoreGeneratedCode:=True 
EnableSQLServerDebugging:=False 
BaseAddress:=4194304 
RemoteDebugEnabled:=False 
StartURL:= 
AllowUnsafeBlocks:=False 
TreatSpecificWarningsAsErrors:= 
PlatformTarget:=AnyCPU 
EnableUnmanagedDebugging:=False 
StartWithIE:=False 
StartArguments:= 
IntermediatePath:=new\path\to\obj2\ 
CodeAnalysisRuleDirectories:=;F:\VS2017\Team Tools\Static Analysis Tools\FxCop\\Rules 
DebugInfo:=full 
CheckForOverflowUnderflow:=False 
RemoteDebugMachine:= 
Prefer32Bit:=True 
CodeAnalysisSpellCheckLanguages:= 
CodeAnalysisRules:= 
RegisterForComInterop:=False 
FileAlignment:=512 
StartAction:=0 
EnableASPXDebugging:=False 
ConfigurationOverrideFile:= 
WarningLevel:=4 
RemoveIntegerChecks:=False 

W projekcie CS miałem dodanej

<IntermediateOutputPath>new\path\to\obj2</IntermediateOutputPath> 

jak ty widać IntermediateOutputPath pojawia się jako IntermediatePath. Więc można użyć

var config = project.ConfigurationManager.ConfigurationRow("Debug").Item(1) as Configuration; 
config.Properties.Item("IntermediatePath").Value 

Edycja 1 - NET standardowy projekt

Output

Edit-2 - 12-sie-2017

więc po wykopaniu więcej na problemem, który odkryłem, jest właściwość MSBuild jako taka, a nie właściwość związana z CSProject. Dlatego nie widzisz go w atrybucie Właściwości. To wymaga nieco inny kierunek, aby uzyskać wartość używając IVsBuildPropertyStorage.GetPropertyValue

private IVsBuildPropertyStorage GetBuildPropertyStorage(EnvDTE.Project project) 
    { 
     IVsSolution solution = (IVsSolution)ServiceProvider.GetService(typeof(SVsSolution)); 

     IVsHierarchy hierarchy; 
     int hr = solution.GetProjectOfUniqueName(project.FullName, out hierarchy); 
     System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(hr); 

     return hierarchy as IVsBuildPropertyStorage; 
    } 

    private string GetBuildProperty(string key, IVsBuildPropertyStorage Storage) 
    { 
     string value; 
     int hr = Storage.GetPropertyValue(key, null, (uint)_PersistStorageType.PST_USER_FILE, out value); 
     int E_XML_ATTRIBUTE_NOT_FOUND = unchecked((int)0x8004C738); 

     // ignore this HR, it means that there's no value for this key 
     if (hr != E_XML_ATTRIBUTE_NOT_FOUND) 
     { 
      System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(hr); 

     } 

     return value; 
    } 

a potem korzystać z tych metod, aby uzyskać wartość

var project = proj as EnvDTE.Project; 
IVsBuildPropertyStorage storage = GetBuildPropertyStorage(project); 
string outputPath = GetBuildProperty("IntermediateOutputPath", storage); 

I to daje mi poprawną wartość właściwości

+0

Czy na pewno ładujesz nowy format csproj? Przez nowy mam na myśli ten, który ma większość domyślnie zdefiniowanych właściwości i treści. – ionoy

+0

Właśnie stworzyłem nowy projekt w studio wizualnym 2017. Jak utworzyć taki z większością właściwości? –

+0

Możesz utworzyć projekt NetStandard. Powinien zdecydowanie użyć nowego formatu. – ionoy