Обработка события перезагрузки проекта в Visual Studio SDK

Я хотел бы проверить и обновить файл csproj, если указанный элемент в csproj обновлен.

событие DocumentSaved не запускается при сохранении файла csproj. Итак, я хочу обработать событие перезагрузки проекта или событие сохранения файла csproj.

У кого-нибудь есть идея для этого?

постскриптум:

Чтобы быть конкретным, я хотел бы переписать HintPath со свойством SolutionDir ($(SolutionDir)\packages\.. ) вместо относительного пути (..\packages\.. ) после добавления или обновления HintPath через Nuget.

Ответ Матце отлично работает!


person Takayoshi Tanaka    schedule 14.10.2015    source источник
comment
При сохранении файла? Или на сборке csproj? Вы можете использовать события сборки msdn.microsoft.com/en-us/library/dd293582. .aspx   -  person StuperUser    schedule 14.10.2015


Ответы (1)


В документации интерфейса _dispDocumentEvents_Event говорится...

Этот API поддерживает инфраструктуру продукта и не предназначен для использования непосредственно из вашего кода.

Только для внутреннего использования Майкрософт.

Конечно, интерфейс общедоступен, но его использование редко документируется, а его доступность и функции могут измениться или могут быть удалены в будущей версии 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, который можно передать методу GetDocumentInfo объекта IVsRunningDocumentTable, чтобы получить имя файла документа, блокировки, соответствующий элемент иерархии, а также указатель на IVsTextBuffer, содержащий данные документов.

person Matze    schedule 14.10.2015