gpt4 book ai didi

visual-studio - 无法从 Visual Studio 2017 DTE 中的 Powershell 控制台访问 FileCodeModel

转载 作者:行者123 更新时间:2023-12-02 03:01:57 28 4
gpt4 key购买 nike

我正在尝试使用集成的 Powershell 控制台和 VS 自动化模型 (DTE) 在 VisualStudio 2017 中自动化一些与代码相关的例程。当我在解决方案/项目/文件级别工作时,一切正常,例如

PS> $dte.ActiveDocument.ProjectItem

IsDirty : False
FileCount : 1
Name : FeaturesComposition.cs
Collection : System.__ComObject
Properties : System.__ComObject
DTE : System.__ComObject
Kind : {6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}
ProjectItems : System.__ComObject
Object : System.__ComObject
ExtenderNames : {}
ExtenderCATID : {610D4615-D0D5-11D2-8599-006097C68E81}
Saved : True
ConfigurationManager :
FileCodeModel : System.__ComObject
Document : System.__ComObject
SubProject :
ContainingProject : System.__ComObject

但是当我遇到某个特定文件的代码模型时,没有什么可以使用的:

PS> $dte.ActiveDocument.ProjectItem.FileCodeModel | Format-List -Property *
System.__ComObject

PS> $dte.ActiveDocument.ProjectItem.FileCodeModel | gm

PS>

是否可以访问此类子模型?有什么简单的方法可以将 EnvDTE.DTE 接口(interface)分派(dispatch)到现有的 $dte 实例吗?我尝试了以下一些想法,但没有成功。

Add-Type -Path "$env:VSAPPIDDIR\PublicAssemblies\envdte.dll"

PS> # Explicit cast doesn't work
PS> [EnvDTE.DTE]$dte

[ERROR] Cannot convert the "System.__ComObject" value of type "System.__ComObject#{04a72314-32e9-48e2-9b87-a63603454f3e}" to type "EnvDTE.DTE".

PS> # Wrapper works but it's useless
PS> $wrapped = [Runtime.InteropServices.Marshal]::CreateWrapperOfType($dte, [EnvDTE.DTEClass])
PS> $wrapped.ActiveDocument.ProjectItem.FileCodeModel

System.__ComObject

PS> # GetComInterfaceForObject gives the same IntPtr as IUnknown:QueryInterface
PS> # different from the call to GetComInterfaceForObject for example,
PS> # so I hoped to get another casting results. But it is the same.
PS> $contract = [Runtime.InteropServices.Marshal]::GetComInterfaceForObject($dte, [EnvDTE.DTE])
PS> [EnvDTE.DTE][Runtime.InteropServices.Marshal]::GetObjectForIUnknown($contract)

[ERROR] Cannot convert the "System.__ComObject" value of type "System.__ComObject#{04a72314-32e9-48e2-9b87-a63603454f3e}" to type "EnvDTE.DTE".

最佳答案

试试这个:

 $fileCodeModel = Get-Interface $dte.ActiveDocument.ProjectItem.FileCodeModel ([ENVDTE80.FileCodeModel2])

关于visual-studio - 无法从 Visual Studio 2017 DTE 中的 Powershell 控制台访问 FileCodeModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237281/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com