C# ';无法转换“";系统;价值…';PowerShell中的错误
我正在尝试将以下C#代码转换为PowerShell(我省略了代码中我认为不相关的部分): C# PowerShellC# ';无法转换“";系统;价值…';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
[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;