DTE:尝试将ProjectItem的Window.Document强制转换为TextDocument抛出异常

时间:2013-06-08 20:14:42

标签: envdte

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:

enter image description here

我的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)).

有什么问题?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分: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