在我的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 ++项目?
答案 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才会存在。