';无法将“;系统__ComObject”;值';PowerShell中出现错误
本文关键字:PowerShell 错误 ComObject 系统 | 更新日期: 2023-09-27 18:25:22
我正在尝试将以下C#代码转换为PowerShell(我忽略了代码中我认为不相关的部分):
C#
System.Type t = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0", true);
object obj = System.Activator.CreateInstance(t, true);
EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)obj;
dte.MainWindow.Activate();
dynamic solution = dte.Solution;
solution.Create(solution_folder_path, solution_name);
solution.SaveAs(solution_file_path);
dynamic project = solution.AddFromTemplate(template_path, project_folder_path, project_name);
TCatSysManagerLib.ITcSysManager system_manager = project.Object;
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.__ComObject"值键入"System.__ComObject#{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_declaration
的DeclarationText
属性。
C#代码修改自:http://infosys.beckhoff.com/english.php?内容=/content/1033/tc3_automationinterface/100886391299624331.html&id=
我是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() - 查看EnvDTE及相关文档
- 此外,你可能还想看看"StudioShell"