在Visual Studio SDK中处理项目重新加载事件

时间:2015-10-14 05:24:17

标签: visual-studio-2015 visual-studio-extensions vsx vspackage visual-studio-sdk

如果更新csproj中的指定项目,我想检查并更新csproj文件。

保存csproj文件时不会触发

DocumentSaved event。 所以我想处理项目重载事件或csproj文件保存事件。

有人有想法吗?

后记:

具体来说,我想在通过Nuget添加或更新HintPath后,用SolutionDir属性($(SolutionDir)\ p​​ackages \ ..)重写HintPath而不是相对路径(.. \ packages \ ..)。

Matze的答案很好!

1 个答案:

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