在 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 的指针。