如何检测 visual studio 扩展中的非托管 C++ 项目

How can I detect an unmanaged C++ project in a visual studio extension

在我的 Visual Studio 扩展中,我需要检测 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++ 项目的新方法?

您可以通过 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
到我的包,因为这个 DLL 只有在安装了对 C++ 项目的支持后才会出现。