Как я могу обнаружить неуправляемый проект C ++ в расширении Visual Studio - PullRequest
0 голосов
/ 03 октября 2018

В моем Visual Studio Extension мне нужно определить, является ли проект C ++ управляемым или неуправляемым кодом.

Ранее у меня был удовлетворительный метод, описанный в этой публикации в MSDNforum.

В этом примере необходимо было получить свойство ManagedExtensions активной конфигурации.

Sub Macro1() 

  Dim objProject As EnvDTE.Project 
  Dim objConfiguration As EnvDTE.Configuration 
  Dim objProperty As EnvDTE.Property 

  For Each objProject In DTE.Solution.Projects 
      objConfiguration = objProject.ConfigurationManager.ActiveConfiguration() 
      objProperty = objConfiguration.Properties.Item("ManagedExtensions") 
      System.Windows.Forms.MessageBox.Show(objProject.Name & " (" & objConfiguration.ConfigurationName & ") ManagedExtensions: " & objProperty.Value.ToString) 
  Next 

End Sub 

К сожалению, этот метод больше не работает для меня.

Для неуправляемых проектов я получаю исключение при попытке извлечь ActiveConfiguration.

Для управляемых проектов я могу получить ActiveConfiguration, но свойство ManagedExtensions недоступно.На самом деле, я думаю, что коллекция свойств пуста.

Существует ли новый способ распознавания неуправляемого проекта C ++?

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете получить свойство ManagedExtensions через объект VCConfiguration с кодом, похожим на

Private Enum compileAsManagedOptions
  managedNotSet            = 0
  managedAssembly          = 1
  managedAssemblyPure      = 2
  managedAssemblySafe      = 3
  managedAssemblyOldSyntax = 4
End Enum


Dim VCProj            As Object                   'VCProject
Dim VCConfig          As Object                   'VCConfiguration
Dim VCManagedOption   As compileAsManagedOptions = compileAsManagedOptions.managedAssemblyPure

VCProj = prj.Object
If VCProj IsNot Nothing Then
  VCConfig = VCProj.Configurations.Item(1)
  If VCConfig IsNot Nothing Then
    VCManagedOption = VCConfig.ManagedExtensions
  End If
End If

, где prj - это объект Envdte.Project.

Этот код выполняется, только если я ужезнаю, что это проект C ++, основанный на типе проекта.

Я определил переменные как объект, так что мне не нужно добавлять ссылку на
Microsoft.VisualStudio.VCProject.dll
в мой пакет, потому что эта DLL будет присутствовать только в том случае, если установлена ​​поддержка проектов C ++.

...