C# 在powershell中使用EnvDTE和VSLangProj:

C# 在powershell中使用EnvDTE和VSLangProj:,c#,.net,powershell,envdte,C#,.net,Powershell,Envdte,我有一个web应用程序项目的解决方案。我试图向其中添加三个c#类库项目,然后将这三个项目的项目引用添加到现有的web应用程序项目中。我正在使用powershell进行此操作。我可以将这三个项目添加到解决方案中,但我不知道如何将项目引用添加到现有项目中。我知道我必须使用VSLangProj.VSProject才能访问引用,但我一直收到转换错误 以下是错误: 无法将“System.\u ComObject”类型的“System.\u ComObject”值{b1042570-25c6-424a-b5

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

以下是错误:

无法将“System.\u ComObject”类型的“System.\u ComObject”值{b1042570-25c6-424a-b58b-56fa83aa828a}”转换为“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)

尝试从
VSLangProj.VSProject
更改为
VSLangProj80.VSProject2
。因此:

$vsproj = [VSLangProj.VSProject]$proj.Object
变成:

$vsproj = [VSLangProj80.VSProject2]$proj.Object
请参阅MSDN上的文档(特别是GuidAttribute)。

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


我刚刚遇到了同样的问题。如中所述,无法将PowerShell
系统.\u ComObject
包装器强制转换为接口类型,尽管您可以使用检查它是否实现COM接口。在大多数情况下,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)
    }
}

在我使用
VSLangProj80.VSProject2
的有限但来之不易的经验中,如果可以成功地将某个内容强制转换为它,那么它也可以强制转换为
VSLangProj.VSProject
。这是有意义的,因为VSProject2是从VSProject派生而来的,但我不确定COM是否能够处理强制转换。错误消息中列出的Guid适用于VSProject2。
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)
    }
}