如何在Visual Studio扩展中检测到不受管理的C ++项目

时间:2018-10-03 16:47:50

标签: visual-studio visual-studio-extensions envdte

在我的Visual Studio Extension中,我需要检测C ++项目是托管代码还是非托管代码。

以前,我有一个令人满意的方法,在MSDN论坛上的this posting中进行了描述。

在该示例中,必须获取活动配置的 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 :(得分:0)

您可以通过VCConfiguration对象获得ManagedExtensions属性,并使用类似的代码

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
到我的程序包中,因为只有在安装了对C ++项目的支持后,此DLL才会存在。