繁体   English   中英

'无法在PowerShell中转换“System .__ ComObject”value ...'错误

[英]'Cannot convert the “System.__ComObject” value …' error in PowerShell

我试图将以下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;

电源外壳

[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#{3b56a5ce-0c02-440b-8ced-f1f3e83f66ed}”类型的“System .__ ComObject”值转换为“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转换为TCatSysManagerLib.ITcPlcDeclaration类型,以便访问gvl_declarationDeclarationText属性。

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

我是C#和PowerShell的新手,并从示例中修改了这些内容。 任何意见,将不胜感激。

这是一些想法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM