gpt4 book ai didi

c# - PowerShell 中的“无法转换 "System.__ComObject"值 ...”错误

转载 作者:行者123 更新时间:2023-11-30 12:42:24 24 4
gpt4 key购买 nike

我正在尝试将以下 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 中的最后一行返回以下形式的错误:

Cannot convert the "System.__ComObject" value of type "System.__ComObject#{3b56a5ce-0c02-440b-8ced-f1f3e83f66ed}" to type "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_declarationDeclarationText 属性.

C# 代码修改自:http://infosys.beckhoff.com/english.php?content=../content/1033/tc3_automationinterface/108086391299624331.html&id=

我是 C# 和 PowerShell 的新手,并且已经从示例中修改了这些。任何建议将不胜感激。

最佳答案

这里有一些想法。

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

关于c# - PowerShell 中的“无法转换 "System.__ComObject"值 ...”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34056047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com