C# ';无法转换“";系统;价值…';PowerShell中的错误

C# ';无法转换“";系统;价值…';PowerShell中的错误,c#,powershell,com,C#,Powershell,Com,我正在尝试将以下C#代码转换为PowerShell(我省略了代码中我认为不相关的部分): C# PowerShell [System.Reflection.Assembly]::LoadFrom("C:\Windows\assembly\GAC_MSIL\TCatSysManagerLib\2.1.0.0__180016cd49e5e8c3\TCatSysManagerLib.dll"); $dte = New-Object -ComObject VisualStudio.DTE.10.0

我正在尝试将以下C#代码转换为PowerShell(我省略了代码中我认为不相关的部分):

C#

PowerShell

[System.Reflection.Assembly]::LoadFrom("C:\Windows\assembly\GAC_MSIL\TCatSysManagerLib\2.1.0.0__180016cd49e5e8c3\TCatSysManagerLib.dll");

$dte = New-Object -ComObject VisualStudio.DTE.10.0

$dte.SuppressUI = $false
$dte.MainWindow | %{$_.GetType().InvokeMember("Visible", "SetProperty", $null, $_, $true)}

$solution = $dte.Solution

$project = $solution.AddFromTemplate($template_path, $project_folder_path, $project_name)

[TCatSysManagerLib.ITcSysManager] $system_manager = [TCatSysManagerLib.ITcSysManager] $project.Object
我遇到的问题是PowerShell中的最后一行返回以下形式的错误:

无法转换类型为的“System.\u ComObject”值 “系统.uuu共同对象{3b56a5ce-0c02-440b-8ced-f1f3e83f66ed}”输入 “TCatSysManagerLib.ITcSysManager”

新增详情:

我可以在PowerShell代码中省略
[TCatSysManagerLib.ITcSysManager]
类型。但是,在以后转换此C#代码时,我遇到了相同的问题:

TCatSysManagerLib.ITcSmTreeItem gvl = system_manager.LookupTreeItem("TIPC^PLC1^PLC1 Project^GVLs^GVL");
TCatSysManagerLib.ITcPlcDeclaration gvl_declaration = (TCatSysManagerLib.ITcPlcDeclaration)gvl;
string gvl_declaration_text = System.IO.File.ReadAllText(gvl_declaration_text_file_path);
gvl_declaration.DeclarationText = gvl_declaration_text;
在这种情况下,我必须转换为
TCatSysManagerLib.ITcPlcDeclaration
类型,以便访问
gvl\u声明的
DeclarationText
属性

C#代码修改自:


我对C#和PowerShell都是新手,并根据示例对其进行了修改。任何建议都将不胜感激。

这里有一些想法

  • 在使用COM类时,建议使用主互操作程序集(PIA)(如果有)。VS有一个。我在注册表中查找
    VisualStudio.DTE
    ,然后找到typelib GUID,然后转到
    typelib
    键查看
    EnvDTE
    被列为PIA。回想起来,谷歌搜索也会找到它。使用
    [reflection.assembly]:loadwithpartialname(“EnvDTE”)
    加载PIA。不幸的是,我无法通过PIA实例化对象。不过,您可以在VS powershell控制台中访问$DTA变量
  • 如果使用#1,可能没有必要,但是可以通过在接口上而不是类上执行
    GetMethod
    来获取COM coclass的
    MethodInfo
    s。然后可以对
    MethodInfo
    使用.Invoke()
  • 请查阅相关的文档
  • 此外,您可能还想查看“StudioShell”

  • 谢谢你的回复。不幸的是,这些术语我不太熟悉。我想我需要做一些背景阅读。如果你想简化一些,我建议:1)决定你的解决方案是否可以在VS中运行。如果可以,那么你可以使用$DTA变量,希望你现有的代码没有太多的mod。无论如何,您可能想要这样做,即使您的解决方案必须是VS外部的,只是为了证明您的PS脚本。2) 决定是否可以使用StudioShell之类的工具。顺便说一句,据我所知,PS中的类型转换与C#中的工作方式不同,因此我不确定我是否会对转换方式的工作方式抱有希望
    MethodInfo
    是.NET类型:System.Reflection.MethodInfo。GetMethod是System.Type Method可能与的重复
    TCatSysManagerLib.ITcSmTreeItem gvl = system_manager.LookupTreeItem("TIPC^PLC1^PLC1 Project^GVLs^GVL");
    TCatSysManagerLib.ITcPlcDeclaration gvl_declaration = (TCatSysManagerLib.ITcPlcDeclaration)gvl;
    string gvl_declaration_text = System.IO.File.ReadAllText(gvl_declaration_text_file_path);
    gvl_declaration.DeclarationText = gvl_declaration_text;