首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“无法转换"System.__ComObject”值.“PowerShell中的误差

“无法转换"System.__ComObject”值.“PowerShell中的误差
EN

Stack Overflow用户
提问于 2015-12-03 01:01:10
回答 1查看 1.8K关注 0票数 4

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

C#

代码语言:javascript
复制
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

代码语言:javascript
复制
[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“类型。

增加的详细资料:

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

代码语言:javascript
复制
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#代码是从:automationinterface/108086391299624331.html&id=修改的

我对C#和PowerShell都很陌生,并通过示例对它们进行了修改。如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-12-03 07:09:01

这里有几个想法。

  1. 在使用COM类时,建议使用主互操作程序集(PIA),如果可用的话。有一个用于VS。我在注册表中查找VisualStudio.DTE,然后查找类型为GUID,然后转到TypeLib键以查看EnvDTE被列为PIA。回想起来,谷歌搜索也会找到它。用[reflection.assembly]::loadwithpartialname("EnvDTE")加载PIA。不幸的是,我无法通过PIA实例化对象。不过,您可以访问VS powershell控制台中的$DTA变量。
  2. 如果您使用#1,可能没有必要,但是您可以通过在接口上而不是在类上执行MethodInfo来获得COM coclass的GetMethod。然后,您可以对一个.Invoke()使用MethodInfo
  3. 查看EnvDTE和相关的文档。
  4. 另外,您可能需要查看"StudioShell“。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34056047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档