2015-12-03 59 views
3

我想將以下C#代碼轉換爲PowerShell(我忽略了我認爲不相關的代碼部分):'無法轉換PowerShell中的「System .__ ComObject」值...'錯誤

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中的最後一行將返回以下形式的錯誤:

無法轉換的類型 「系統.__ ComObject」 值 「系統.__ 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_declarationDeclarationText財產。

的C#代碼是從修改:http://infosys.beckhoff.com/english.php?content=../content/1033/tc3_automationinterface/108086391299624331.html&id=

我是新來的C#和PowerShell和從實例修改了這些。任何意見,將不勝感激。

回答

0

這裏有幾個想法。

  1. 在使用COM類時,建議使用主互操作程序集(PIA)(如果有)。有一個VS.我通過在註冊表中查找VisualStudio.DTE,然後找到typelib GUID,並轉到TypeLib密鑰來查看EnvDTE被列爲PIA。回想起谷歌搜索也會發現它。用[reflection.assembly]::loadwithpartialname("EnvDTE")加載PIA。不幸的是,我不能通過PIA實例化一個對象。不過,您可以在VS powershell控制檯中訪問$ DTA變量。
  2. 如果您使用#1,可能沒有必要,但您可以通過在Interface上執行GetMethod而不是類來獲得COM協作類的MethodInfo。然後,您可以使用.Invoke()對MethodInfo
  3. 查看EnvDTE及相關文件。
  4. 另外你可能想看看「StudioShell」。
+0

謝謝您的迴應。不幸的是,我並不熟悉這些術語。我想我將不得不做一些背景閱讀。 – Patrick

+0

如果你想簡化一下,我建議:1)決定你的解決方案是否可以在VS內運行。如果可以的話,你可以使用$ DTA變量,希望你現有的代碼不需要太多的mod。無論如何,即使您的解決方案必須在VS外部,您也可能想要這樣做,只是爲了證明您的PS腳本。 2)決定是否可以使用StudioShell之類的工具。順便說一句,從我可以告訴,PS中的類型轉換與C#中的轉換不一樣,所以我不確定我是否希望演員能像你想要的那樣工作。 'MethodInfo'是.NET類型:System.Reflection.MethodInfo。 GetMethod是一個System.Type方法 –

相關問題