首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VS2015宏中找不到VCCLCompilerTool (使用可视指挥官)

在VS2015宏中找不到VCCLCompilerTool (使用可视指挥官)
EN

Stack Overflow用户
提问于 2015-12-03 07:54:15
回答 1查看 530关注 0票数 0

我正在使用可视化指挥官(来自https://vlasovstudio.com/visual-commander/)来移植一些宏,用于操作从VS2010到VS2015的C++项目。事情看起来一切正常(我可以访问解决方案,创建VCProjects,循环配置等),但我有一个问题-在VS2010中工作的调用:

代码语言:javascript
复制
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方法文档中的示例插入到一个可视指挥官命令中,并得到了相同的结果。

代码语言:javascript
复制
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“,但得到了同样糟糕的结果。)

EN

回答 1

Stack Overflow用户

发布于 2015-12-08 05:54:54

多亏了“视觉指挥官”的作者谢尔盖·弗拉索夫,我找到了答案。他指出,示例代码的C#版本在VS2015中工作。C#和VB代码在所讨论的代码行中略有不同。C#代码为:

代码语言:javascript
复制
tool = 
  (Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)
  tools.Item("VCCLCompilerTool");

而VB代码是:

代码语言:javascript
复制
tool = CType(cfg.Tools("VCCLCompilerTool"), _
  Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)

此VB在VS2010中运行良好,但它看起来像在VS2015中,默认情况下,Tools集合不能再按名称索引。因此,我只需要添加".Item",它将VB代码更改为:

代码语言:javascript
复制
tool = CType(cfg.Tools.Item("VCCLCompilerTool"), _
  Microsoft.VisualStudio.VCProjectEngine.VCCLCompilerTool)

现在这个宏一切都好了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34055392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档