在 Visual Studio SDK 中处理项目重新加载事件
Handle project reload event in Visual Studio SDK
如果 csproj 中的指定项目更新,我想检查并更新 csproj 文件。
保存 csproj 文件时不会触发 DocumentSaved event。
所以我想处理项目重新加载事件或 csproj 文件保存事件。
有没有人有想法?
后记:
具体来说,我想用 SolutionDir 属性 ($(SolutionDir)\packages\.. ) 而不是相对路径 (..\packages\.. )通过 Nuget 添加或更新。
Matze 的回答很好!
_dispDocumentEvents_Event
接口的文档说...
This API supports the product infrastructure and is not intended to be
used directly from your code.
Microsoft Internal Use Only.
当然,接口是 public,但很少记录其用法,并且它的可用性和功能可能会在 IDE 的未来版本中更改或删除。我不建议将其用作自定义扩展功能的基础。
相反,您可以使用 IVsRunningDocumentTable
服务和 IVsRunningDocTableEvents
接口的自定义实现,它通过 AfterSave
事件提供类似的功能。我建议实现一个 class 来处理事件订阅并隐藏不必要的细节。例如...
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
的指针。
如果 csproj 中的指定项目更新,我想检查并更新 csproj 文件。
保存 csproj 文件时不会触发DocumentSaved event。 所以我想处理项目重新加载事件或 csproj 文件保存事件。
有没有人有想法?
后记:
具体来说,我想用 SolutionDir 属性 ($(SolutionDir)\packages\.. ) 而不是相对路径 (..\packages\.. )通过 Nuget 添加或更新。
Matze 的回答很好!
_dispDocumentEvents_Event
接口的文档说...
This API supports the product infrastructure and is not intended to be used directly from your code.
Microsoft Internal Use Only.
当然,接口是 public,但很少记录其用法,并且它的可用性和功能可能会在 IDE 的未来版本中更改或删除。我不建议将其用作自定义扩展功能的基础。
相反,您可以使用 IVsRunningDocumentTable
服务和 IVsRunningDocTableEvents
接口的自定义实现,它通过 AfterSave
事件提供类似的功能。我建议实现一个 class 来处理事件订阅并隐藏不必要的细节。例如...
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
的指针。