【问题标题】:Can one cast an EnvDTE.Project into a VCProject可以将 EnvDTE.Project 转换为 VCProject
【发布时间】:2015-04-29 18:11:52
【问题描述】:

到目前为止,我已经看到了两篇与我的问题有关的帖子。我想知道如何将 EnvDTE.Project 转换为 VCProject。

this post 中,fun4jimmy 的答案正是在以下代码行中完成的(取自他的答案):

VCProject vcProject = project.Object as VCProject;

我尝试在我的解决方案中做同样的事情:

using EnvDTE;
using Microsoft.VisualStudio.VCProjectEngine;
[...]
private List<string> BuildAssembliesAndReturnTheirName(EnvDTE80.DTE2 dte)
{
    Solution sln = dte.Solution;

    bool isDirty = false;
    foreach (Project project in sln.Projects)
    {
        VCProject vcProject = project.Object as VCProject;
        Configuration activeConfiguration = project.ConfigurationManager.ActiveConfiguration;
        foreach (VCConfiguration vcConfiguration in vcProject.Configurations)
        {
            //business logic
        }
    }
[...]

在 VS 中打开了一个解决方案。该解决方案包含一些 C# 项目。一切似乎都是为了让这段代码执行,直到我到达

foreach (VCConfiguration vcConfiguration in vcProject.Configurations) 

才意识到这个演员表

VCProject vcProject = project.Object as VCProject;

返回空值。

谁能告诉我这是为什么?我见过this post,其中 hveiras 建议

每个 VS 版本都有一个 VCCodeModel.dll。

如果 VCProjectEngine.dll 也是这种情况,我该如何解决我的问题?

我已更改对 VCProjectEngine.dll 的引用,以便它使用 Visual Studio 2012(我正在使用的)的引用,但 vcProject 仍然为空。

【问题讨论】:

  • 您是否调试并查看了project.Object 的实际类型是什么?
  • @RonBeyer 这是一个 COM 对象,但它的标识似乎为空……这正常吗?
  • @RonBeyer 我问的原因是因为我没有对项目本身进行任何操作。我只是循环浏览这些项目以获取有关它们的一些信息。我知道我询问它的身份是否为 null 可能有点奇怪,但是我在发布循环之后循环项目以获得项目的属性,例如 FullName 和 Properties("OutputFileName") 如果我跳过我的循环,它们可以正常工作.
  • 解决方案中有哪些项目?它们是 C++ 还是 C# 项目?
  • VCProject 是针对 C++ 项目的,可以解释为什么它为空,见msdn.microsoft.com/en-us/library/…

标签: c# visual-studio-2012 envdte


【解决方案1】:

VCProject 用于 C++ 项目,为了使用与 C#/VB 项目类似的接口,您必须使用 VSProject

有许多VSLangProj 重载/扩展,您必须找到特定于您需要使用的版本的一个。请参阅:https://msdn.microsoft.com/en-us/library/1xt0ezx9.aspx 了解从 2 到 100 的所有 VSLangProj 接口(我认为这是版本 2 到版本 10)。

【讨论】:

  • 我在这里遗漏了一些东西 - 我目前看到只有 3 个版本的 VSLangProj:VSLangProj、VSLangProj2、VSLangProj80。参考:msdn.microsoft.com/en-us/library/vslangproj.aspx
  • @OriNachum 答案是 2 岁,适用于 VS2012,如果您使用的是较新的 VS2015 解决方案,格式可能已经改变。
【解决方案2】:

您不能转换 Project 对象本身,因为没有继承关系。
但是你可以使用内部对象:

VCProject vcProject = project.Object as VCProject;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2018-11-21
    相关资源
    最近更新 更多