2015-04-16 30 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