_dispDocumentEvents_Event 接口的文档说...
此 API 支持产品基础架构,并非旨在
直接从您的代码中使用。
仅限 Microsoft 内部使用。
当然,该接口是公开的,但很少记录其用法,并且它的可用性和功能可能会发生变化,或者可能会在 IDE 的未来版本中被删除。我不建议将其用作自定义扩展功能的基础。
相反,您可以使用IVsRunningDocumentTable 服务和IVsRunningDocTableEvents 接口的自定义实现,它通过AfterSave 事件提供类似的功能。我建议实现一个类来处理事件订阅并隐藏不必要的细节。比如……
internal abstract class RunningDocumentTableEvents :
IDisposable,
IVsRunningDocTableEvents
{
private readonly IVsRunningDocumentTable rdt;
private readonly uint sinkCookie;
public RunningDocumentTableEvents(IServiceProvider serviceProvider)
{
this.rdt = serviceProvider.GetSerice(typeof(SVsRunningDocumentTable))
as IVsRunningDocumentTable;
uint cookie;
this.rdt.AdviseRunningDocTableEvents(this, out cookie);
this.sinkCookie = cookie;
}
protected abstract void OnAfterSave(AfterSaveEventArgs e);
int IVsRunningDocTableEvents.OnAfterSave(uint docCookie)
{
uint flags, readLocks, editLocks, itemId;
string moniker;
IVsHierarchy hierarchy;
IntPtr docData;
int hr = this.rdt.GetDocumentInfo(
docCookie, out flags, out readLocks, out editLocks, out moniker,
out hierarchy, out itemId, out docData);
if (hr == VSConstants.S_OK)
{
var e = new AfterSaveEventArgs { FileName = moniker, ... };
this.OnAfterSave(e);
}
return VSConstants.S_OK;
}
...
public void Dispose()
{
this.rdt.UnadviseRunningDocTableEvents(this.sinkCookie);
}
}
OnAfterSave 回调接收一个 cookie,该 cookie 可以传递给 IVsRunningDocumentTable 对象的 GetDocumentInfo 方法,以获取文档的文件名、锁、相关的层次结构项以及指向IVsTextBuffer 保存文档数据。