加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ‘无法在PowerShell中转换“System .__ ComObject”value

发布时间:2020-12-15 22:23:27 所属栏目:百科 来源:网络整理
导读:我试图将以下C#代码转换为Power Shell(我遗漏了我认为不相关的代码部分): C# System.Type t = System.Type.GetTypeFromProgID("VisualStudio.DTE.10.0",true);object obj = System.Activator.CreateInstance(t,true);EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)ob
我试图将以下C#代码转换为Power Shell(我遗漏了我认为不相关的代码部分):

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:WindowsassemblyGAC_MSILTCatSysManagerLib2.1.0.0__180016cd49e5e8c3TCatSysManagerLib.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_declaration的DeclarationText属性.

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

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

解决方法

这是一些想法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读