2015-04-16 52 views
2

我使用EnvDTE的PowerShell腳本來自動Visual Studio 2010中這是我使用的代碼片段:EnvDTE的類型庫在哪裏?

[void][System.Reflection.Assembly]::LoadWithPartialName("EnvDTE") # (Obsolete!) 

$DTE.MainWindow | %{$_.gettype().InvokeMember("Visible","SetProperty",$null,$_,$true)} 

據我瞭解,這是「後期綁定」的代碼。根據我的研究,我認爲我需要EnvDTE程序集的類型庫,以便我可以在PowerShell中使用代碼,這將允許我直接訪問COM對象方法/成員,而不是使用InvokeMember

EnvDTE的類型庫在哪裏?

+1

相關:http://stackoverflow.com/questions/15210806/how-to-use-dte-in-powershell –

+0

資源管理器有這個偉大的功能,您可以搜索您的硬盤上的任何文件。你嘗試過嗎? – Will

+0

@會感謝您的諷刺評論。我安裝了[Search Everything](http://www.voidtools.com/)引擎,但我一直在搜索'.tlb'文件。不知道'.olb'文件中還提供了類型庫。現在,你知道我如何擺脫'InvokeMember'並直接訪問成員/方法嗎? – Sabuncu

回答

3

「dte * .olb」是位於C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ MSEnv \中的註冊類型庫(更準確地說,可以在註冊表中使用LIBID查找相應的路徑,例如, HKEY_CLASSES_ROOT \類型庫{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2} \ 8.0 \ 0 \ win32)中。類型庫名稱是「Microsoft開發環境」。例如:

enter image description here

// Generated .IDL file (by the OLE/COM Object Viewer) 
// 
// typelib filename: dte80a.olb 

[ 
    uuid(80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2), 
    version(8.0), 
    helpstring("Microsoft Development Environment 8.0 (Version 7.0 Object Model)") 
] 
library EnvDTE // <<---------------- 
{ 
    // TLib :  // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} 
    importlib("stdole2.tlb"); 

    // Forward declare all types defined in this typelib 
    interface _DTE; 
    interface Windows; 
    interface Window; 
    [...] 

UPDATE。看看MainWindow報告的是什麼類型的信息,我看到VisualStudio.DTE.9.0VisualStudio.DTE.10.0(VS2010及以上)報告的信息存在差異。

MainWindow報告(reference code)參照有效註冊類型庫,以及新的「壞」包含的類型庫{F11EBD51-0035-3612-BFB9-7D9ED680A986}在Microsoft.VisualStudio.Platform.WindowManagement.dll,這是不註冊,不具備有效的磁盤映像MainWindow報告(可能會動態創建)。

Trying VisualStudio.DTE.9.0 
nTypeInfoCount 1 
pTypeInfo 0x005CAF8C 
pTypeLib 0x005CB064, nTypeLibIndex 67 
sName "EnvDTE80", sDocumentation "Microsoft Development Environment 8.0" 
pLibAttr->guid {1A31287A-4D7D-413E-8E32-3B374931BD89}, lcid 0x0000, syskind 1, wMajorVerNum 8, wMinorVerNum 0, wLibFlags 0x8 
vVisible.vt 0xB 

Trying VisualStudio.DTE.10.0 
nTypeInfoCount 1 
pTypeInfo 0x005CB1CC 
pTypeLib 0x005CB2A4, nTypeLibIndex 8 
sName "Microsoft_VisualStudio_Platform_WindowManagement", sDocumentation "Microsoft.VisualStudio.Platform.WindowManagement.dll" 
pLibAttr->guid {F11EBD51-0035-3612-BFB9-7D9ED680A986}, lcid 0x0000, syskind 1, wMajorVerNum 10, wMinorVerNum 0, wLibFlags 0x0 
vVisible.vt 0xB 

看起來PowerShell是無法使用這種類型的信息和你唯一的解決辦法是使用InvokeHelper

+0

謝謝。關於如何利用此文件的任何想法,以便我可以擺脫「InvokeMember」訪問方法? – Sabuncu

+0

我不確定PowerShell,但我的印象是你應該能夠直接使用成員名稱/方法,因爲這些可以通過COM'IDispatch'接口和類型庫發現。 [這裏](http://www.vistax64.com/powershell/11120-powershell-interacting-com-automation-late-binding.html)是來自2006年的MSFT傢伙的一些評論:「PowerShell無法顯示方法如果未提供ITypeInfo接口,則COM對象將很快解決,解決方法是使用Type.InvokeMethod「。可能「很快」不會發生。 –

+0

寶貴的鏈接,謝謝。 – Sabuncu