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)).
有什么问题?任何帮助表示赞赏。
答案 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