我正在使用可视化指挥官(来自https://vlasovstudio.com/visual-commander/)来移植一些宏,用于操作从VS2010到VS2015的C++项目。事情看起来一切正常(我可以访问解决方案,创建VCProjects,循环配置等),但我有一个问题-在VS2010中工作的调用:
cfg.Tools("VCCLCompilerTool")VS2015中的...fails,并带有一个"System.MissingMemberException:没有为类型‘VCCollectionShim’找到默认成员“。错误,表明集合没有"VCCLCompilerTool“项。
有人知道怎么解决这个问题吗?或者是访问配置的C++编译器设置的另一种方式?(不是手动解析vcxproj XML文件。)
如果我打印出cfg.Tools中每一项的ToString()值,我只看到'shims‘,比如'Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCCLCompilerToolShim'.
如果我在一个真实的VS2010宏中执行同样的操作(可以工作),每一项都显示为“System.__ComObject”。
在互联网上搜索表明,“填充”错误意味着代码正在访问错误版本的VCProjectEngine或VCProject程序集。我确实安装了VS2005和VS2010,以便在其他项目中使用,但我临时重命名了这些DLL的旧版本所在的每个位置,但仍然遇到相同的问题。也许它仍然是从其他地方获得的,比如GAC?
我尝试将https://msdn.microsoft.com/en-US/library/microsoft.visualstudio.vcprojectengine.ivccollection.item(v=vs.140).aspx上的IVCCollection.Item方法文档中的示例插入到一个可视指挥官命令中,并得到了相同的结果。
Imports EnvDTE
Imports EnvDTE80
Imports Microsoft.VisualBasic
Imports System
Imports System.Diagnostics
Imports Microsoft.VisualStudio.VCProjectEngine
Imports System.Text
Public Class C
Implements VisualCommanderExt.ICommand
Sub Run(DTE As EnvDTE80.DTE2, package As Microsoft.VisualStudio.Shell.Package) Implements VisualCommanderExt.ICommand.Run
EnablePREfastExample(DTE)
End Sub
Sub EnablePREfastExample(ByVal dte As DTE2)
Dim prj As VCProject
Dim cfgs, tools As IVCCollection
Dim cfg As VCConfiguration
Dim tool As VCCLCompilerTool
Dim sb As New StringBuilder
prj = CType(dte.Solution.Projects.Item(1).Object, _
Microsoft.VisualStudio.VCProjectEngine.VCProject)
cfgs = CType(prj.Configurations, _
Microsoft.VisualStudio.VCProjectEngine.IVCCollection)
cfg = CType(cfgs.Item(1), _
Microsoft.VisualStudio.VCProjectEngine.VCConfiguration)
' This fails
tool = CType(cfg.Tools("VCCLCompilerTool"), _
Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)
sb.Length = 0
sb.Append("Current project PREfast setting: " _
& tool.EnablePREfast & Environment.NewLine)
sb.Append("Flag: " & tool.AdditionalOptions)
MsgBox(sb.ToString)
End Sub
End Class我在References…中设置了该值对话框中的"Microsoft.VisualStudio.VCProjectEngine“。(我还尝试完整地指定路径名,如"C:\Program Files (x86)\Microsoft Visual Studio GAC“或完整的GAC名,如”Microsoft.VisualStudio.VCProjectEngine,Version=14.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a“,但得到了同样糟糕的结果。)
发布于 2015-12-08 05:54:54
多亏了“视觉指挥官”的作者谢尔盖·弗拉索夫,我找到了答案。他指出,示例代码的C#版本在VS2015中工作。C#和VB代码在所讨论的代码行中略有不同。C#代码为:
tool =
(Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)
tools.Item("VCCLCompilerTool");而VB代码是:
tool = CType(cfg.Tools("VCCLCompilerTool"), _
Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)此VB在VS2010中运行良好,但它看起来像在VS2015中,默认情况下,Tools集合不能再按名称索引。因此,我只需要添加".Item",它将VB代码更改为:
tool = CType(cfg.Tools.Item("VCCLCompilerTool"), _
Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)现在这个宏一切都好了。
https://stackoverflow.com/questions/34055392
复制相似问题