如果更新csproj中的指定项目,我想检查并更新csproj文件。
保存csproj文件时不会触发DocumentSaved event。 所以我想处理项目重载事件或csproj文件保存事件。
有人有想法吗?
后记:
具体来说,我想在通过Nuget添加或更新HintPath后,用SolutionDir属性($(SolutionDir)\ packages \ ..)重写HintPath而不是相对路径(.. \ packages \ ..)。
Matze的答案很好!
答案 0 :(得分:1)
_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可以传递给GetDocumentInfo
对象的IVsRunningDocumentTable
方法,以获取文档的文件名,锁,相关的层次结构项以及指向保存文档数据的IVsTextBuffer
的指针。