3

Carlos J. Quintero 似乎对 DTE 了解很多。在今年 3 月更新并发布在网络 ( http://www.mztools.com/articles/2007/mz2007027.aspx ) 上的一篇文章中,他说 EnvDTE 上的 Open 方法。ProjectItem 返回一个 EnvDTE.Window,其 Document 属性可以转换为 EnvDTE.TextDocument。

但是当我尝试这个时,我得到一个异常(HRESULT:0x80004002 [E_NOINTERFACE])。Open 返回的 __ComObject 似乎不知道 TextDocument:

在此处输入图像描述

摘自我的 VB .Net 代码(在 WOW 中在 Windows 7 Pro 64 下运行的 VS2008)的一段(摘录并稍加编辑):

... BuildEvents.OnBuildBegin 的处理程序递归遍历所有项目中的所有项目;过滤名称以查找包含“.Designer.vb”的名称(显然在这里可以正常工作)。对于每一个找到的,要替换某些文本;为此,需要 TextDocument 对象:

'the below returns __ComObject instead of EnvDTE.Window
Dim ItemWindow as EnvDTE.Window = ProjectItem.Open(EnvDTE.Constants.vsext_vk_Code) 
'the below throws exception
Dim ItemTextDocument as EnvDTE.TextDocument = CType(ItemWindow.Document, EnvDTE.TextDocument) 

完全错误:

Unable to cast COM object of type 'System.__ComObject' to interface type 'EnvDTE.TextDocument'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{CB218890-1382-472B-9118-782700C88115}' failed due to the following error: Interface wordt niet ondersteund (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

怎么了?任何帮助表示赞赏。

4

1 回答 1

2

我遇到了同样的问题

您可以通过指定要从窗口对象获取的文档类型来解决此问题

public static void SetCode(ProjectItem projectItem, string newCode)
{

    Window EditWindow = projectItem.Open(Constants.vsext_vk_Code);
    EditWindow.Visible = true; //hide editor window

    TextDocument TextDocument = (TextDocument)EditWindow.Document.Object("TextDocument");

    EditPoint EditPoint = TextDocument.StartPoint.CreateEditPoint();
    EditPoint.Delete(TextDocument.EndPoint); //delete content
    EditPoint.Insert(newCode);

    EditWindow.Close(vsSaveChanges.vsSaveChangesYes);
}

您必须自己将其转换回 VB.NET

于 2013-06-18T18:12:10.157 回答