【问题标题】:Using EnvDTE and VSLangProj in powershell :在 powershell 中使用 EnvDTE 和 VSLangProj:
【发布时间】:2014-02-18 20:02:51
【问题描述】:

我有一个包含 1 个 Web 应用程序项目的解决方案。我正在尝试向其中添加三个 c# 类库项目,然后将这三个项目的项目引用添加到现有的 Web 应用程序项目中。我正在使用 powershell 执行此操作。我能够将这三个项目添加到解决方案中,但我不知道如何将项目引用添加到现有项目中。我知道我必须使用 VSLangProj.VSProject 才能访问引用,但我不断收到转换错误。

这里是错误:

无法将“System._ComObject”类型的“System._ComObject”值转换为“VSLangProj.VSProject”类型。

这是我到目前为止的相关代码。

[void][System.Reflection.Assembly]::LoadWithPartialName("envdte.dll")
[void][System.Reflection.Assembly]::LoadWithPartialName("envdte80.dll")
[void][System.Reflection.Assembly]::LoadWithPartialName("VSLangProj.dll")
[void][System.Reflection.Assembly]::LoadWithPartialName("VSLangProj80.dll")

$envdte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.12.0")


    $envdte.Solution.Open($FullPathtoSolution)

    $envdte.Solution.AddFromFile($FUllPathtoNewProject1)
$envdte.Solution.AddFromFile($FUllPathtoNewProject2)
$envdte.Solution.AddFromFile($FUllPathtoNewProject3) 

    $envdte.Solution.SaveAs($FullPathtoSolution)

    foreach ($proj in $envdte.Solution.Projects)
               {
                    $proj.Kind #Prints {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
        $proj.Name #Prints the name of my web application project like it should
        $vsproj = [VSLangProj.VSProject]$proj.Object #this line causes the error
        $vsproj.References.AddProject($NewProject1Name)
                    $vsproj.References.AddProject($NewProject2Name)
                    $vsproj.References.AddProject($NewProject3Name)
                }



$envdte.Solution.SaveAs($FullPathtoSolution)

【问题讨论】:

    标签: c# .net powershell envdte


    【解决方案1】:

    尝试将VSLangProj.VSProject 更改为VSLangProj80.VSProject2。所以:

    $vsproj = [VSLangProj.VSProject]$proj.Object
    

    变成:

    $vsproj = [VSLangProj80.VSProject2]$proj.Object
    

    请参阅 MSDN 上的 VSProject2 Interface 文档(特别是 GuidAttribute)。

    【讨论】:

    • 在我有限但来之不易的VSLangProj80.VSProject2 经验中,如果可以成功地将某些东西投射到它上面,那么它也可以投射到VSLangProj.VSProject 上。
    • 这是有道理的,因为 VSProject2 是从 VSProject 派生的,但我不确定 COM 是否处理强制转换。错误消息中列出的 Guid 适用于 VSProject2。
    【解决方案2】:

    根据VSProject Interface 的文档,EnvDte.Project.Object 是仅适用于 Visual Basic 或 Visual C# 项目的 VSProject。您可以尝试以下方法(C# 中的示例):

    if (project.Kind == VSLangProj.PrjKind.prjKindCSharpProject)
    {
        var vsproj = (VSLangProj.VSProject)project.Object;
        vsproj.References.Add(...);
    }
    

    【讨论】:

      【解决方案3】:

      我刚刚遇到了同样的问题。正如PowerShell: how to convert a COM object to an .NET interop type? 中所讨论的,虽然您可以使用-is 检查它是否实现了COM 接口,但无法将PowerShell System._ComObject 包装器强制转换为接口类型。在大多数情况下,PowerShell 会自动转发到正确的接口而不进行强制转换:

      foreach ($proj in $envdte.Solution.Projects) {
          if ($proj.Object -is [VSLangProj.VSProject]) {
              $vsproj = $proj.Object
              $vsproj.References.AddProject($NewProject1Name)
              $vsproj.References.AddProject($NewProject2Name)
              $vsproj.References.AddProject($NewProject3Name)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多