首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在powershell中使用EnvDTE和VSLangProj:

在powershell中使用EnvDTE和VSLangProj:
EN

Stack Overflow用户
提问于 2014-02-18 20:02:51
回答 3查看 1.9K关注 0票数 3

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

以下是错误:

无法将"System._ComObject#{b1042570-25c6-424a-b58b-56fa83aa828a}“类型的"System._ComObject”值转换为"VSLangProj.VSProject“类型。

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

代码语言:javascript
复制
[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)
EN

回答 3

Stack Overflow用户

发布于 2014-03-26 21:55:52

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

代码语言:javascript
复制
$vsproj = [VSLangProj.VSProject]$proj.Object

变成:

代码语言:javascript
复制
$vsproj = [VSLangProj80.VSProject2]$proj.Object

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-15 19:51:18

根据VSProject接口文档,EnvDte.Project.Object仅适用于Visual或VisualC#项目。您可以尝试以下操作(C#中的示例):

代码语言:javascript
复制
if (project.Kind == VSLangProj.PrjKind.prjKindCSharpProject)
{
    var vsproj = (VSLangProj.VSProject)project.Object;
    vsproj.References.Add(...);
}
票数 0
EN

Stack Overflow用户

发布于 2020-06-17 01:45:35

我刚刚遇到了同样的问题。正如PowerShell:如何将COM对象转换为.NET互操作类型?中所讨论的,不可能将PowerShell System._ComObject包装器转换为接口类型,尽管您可以检查它是否使用-is实现COM接口。在大多数情况下,PowerShell将自动转发到正确的界面,而无需强制转换:

代码语言:javascript
复制
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)
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21864118

复制
相关文章

相似问题

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