Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2012 如何通知编辑器文档更改_Visual Studio 2012_Visual Studio Extensions_Vsix_Vsx_Vspackage - Fatal编程技术网

Visual studio 2012 如何通知编辑器文档更改

Visual studio 2012 如何通知编辑器文档更改,visual-studio-2012,visual-studio-extensions,vsix,vsx,vspackage,Visual Studio 2012,Visual Studio Extensions,Vsix,Vsx,Vspackage,我在自定义项目系统上工作,在重命名项目时遇到问题。该项目系统的实施是基于MPF和通过解决方案资源管理器重命名项目或多或少没有任何问题,但 当一个项目被重命名时,我也会更新存储在文件本身中的信息。如果代码编辑器打开文档,编辑器中的文本不会被刷新(只有文档窗口的标题更改为新文件名)。当然,如果保存打开的文档,重命名操作应用的所有更改都将被覆盖 如何强制编辑器重新加载文档,以便显示自动更改?假设它是文本文件,而不是某个自定义设计器,请使用IVsRunningDocumentTable界面获取当前打开的

我在自定义项目系统上工作,在重命名项目时遇到问题。该项目系统的实施是基于MPF和通过解决方案资源管理器重命名项目或多或少没有任何问题,但

当一个项目被重命名时,我也会更新存储在文件本身中的信息。如果代码编辑器打开文档,编辑器中的文本不会被刷新(只有文档窗口的标题更改为新文件名)。当然,如果保存打开的文档,重命名操作应用的所有更改都将被覆盖


如何强制编辑器重新加载文档,以便显示自动更改?

假设它是文本文件,而不是某个自定义设计器,请使用
IVsRunningDocumentTable
界面获取当前打开的文件的文本缓冲区。接口的名称是托管代码中最容易使用的名称。您可以调用
IsMonikerValid
(其中“名字对象”是文件名)查看文件是否打开,如果打开,则调用
GetDocumentData
获取文件的
IVsTextBuffer
。使用这种类型本身相当烦人,因此,如果您只支持Visual Studio 2010或更高版本,请将其传递到以获取其更新的编辑器API版本


就他们“为什么”而言,这样做是个好主意:如果您编辑磁盘上的文件,然后尝试强制重新加载,您可能会遇到各种问题。如果文件在重命名之前未保存,则可能会意外丢失那些未保存的编辑。重新加载可能会导致文件的撤消历史丢失,并且使用编辑器跟踪跨距或标记跟踪文件中的点的任何其他扩展名/功能可能会丢失它们正在跟踪的点。如果文件是大文件,性能也会更好。

如何编辑文件?只是更改磁盘上的位或通过一些编辑器API进行编辑?我有一个可以修改的AST模型;所以,是的,我更改了磁盘上的位…最好的方法不是编辑磁盘上的位,而是通过VS API编辑文本。如果你能避免的话,强制重新加载并不是件好事;你能找到一些文件吗?解决这类问题的最佳方法是什么;我的意思是要重命名的文档可以在编辑器中打开,也可以不打开。。。如何确定文档是否已打开;如果它打开了,我应该如何与窗口交互?通过VS API修改文档的推荐方法是什么?
IVsRunningDocumentTable4
仅在Visual Studio 2013中提供,不是吗?我可能需要使用
IVsRunningDocumentTable
GetDocumentInfo
,如果我也想支持Visual Studio 2012……在这种情况下,只需使用编号较低的界面,但需要注意的是,您必须调用一些不太友好的方法。对那些处理INTPTR的人要非常小心。如果使用错误,将导致内存泄漏。我使用了
IVsRunningDocumentTable
中的
finandlockdocument
,并试图将
封送的结果安全地强制转换为
IVsTextBuffer
。这很有效。最后,我发布了文档中提到的ppunkDocData。一旦我从
IVsTextBuffer
获得了
ITextBuffer
,应用更改就不再是什么大事了。非常感谢!