【问题标题】:Handle project reload event in Visual Studio SDK在 Visual Studio SDK 中处理项目重新加载事件
【发布时间】:2015-10-14 05:24:17
【问题描述】:

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

DocumentSaved event 在保存 csproj 文件时不会触发。 所以我想处理项目重新加载事件或csproj文件保存事件。

有人对此有想法吗?

后记:

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

Matze 的回答很好用!

【问题讨论】:

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


【解决方案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 可以传递给 IVsRunningDocumentTable 对象的 GetDocumentInfo 方法,以获取文档的文件名、锁、相关的层次结构项以及指向IVsTextBuffer 保存文档数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2012-07-07
    相关资源
    最近更新 更多