Согласование метода VS (отладчик VS) - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь понять, как работает цепочка методов (вызывая предыдущую реализацию или реализацию по умолчанию) (https://github.com/Microsoft/ConcordExtensibilitySamples/wiki/Component-discovery-and-configuration), но все еще есть много сомнений.

  • DkmExample, кажется, диспетчер, ноКак определяется этот класс? Могу ли я определить такой класс?

  • Интерфейсы Concord (Microsoft.VisualStudio.Debugger.ComponentInterfaces) не передают диспетчер в своих методах, поэтому как его можно добавить вреализация? Может ли какой-либо интерфейс Concord быть связан таким образом?

  • Может кто-нибудь показать, как реализовать цепочку методов в https://github.com/microsoft/ConcordExtensibilitySamples/tree/master/HelloWorld/Cs (показать, как вызвать реализацию по умолчанию), или предоставитьдругой реальный пример?

Заранее спасибо

1 Ответ

2 голосов
/ 12 ноября 2019

В Примере цепочки методов IDkmExample представляет интерфейс, который является частью Concord API. Это интерфейс, который вы, как разработчик, реализуете. В самом вызове метода DkmExample - это не dispatcher, а dispatcher object, с которым диспетчер знает, как обращаться. Они определяются диспетчером и не могут быть определены внешне.

Пример цепочки методов показывает, что если реализация не хочет обрабатывать вызов метода интерфейса, то она может вызвать метод с тем же именем в dispatcher object (первый элемент вСигнатура метода API), передавая все параметры, принимаемые сигнатурой метода, минус сам объект диспетчера. Это позволит диспетчеру передать вызов на основе фильтрации и приоритета следующей реализации интерфейса, который он может найти.

В качестве конкретного примера мы можем посмотреть на следующий блок из Microsoft.VisualStudio.Debugger.Engine.xml из пакета microsoft.visualstudio.debugger.engine nuget:

<member name="M:Microsoft.VisualStudio.Debugger.ComponentInterfaces.IDkmStartDebuggingOperations.LaunchDebuggedProcess(Microsoft.VisualStudio.Debugger.Start.DkmProcessLaunchRequest)">
    <summary>
    Causes the debug monitor to create a new process under the debugger. The process
    should be left suspended until ResumeDebuggedProcess is called. The debug monitor
    must wait for ResumeDebuggedProcess before creating the DkmProcess object since
    it needs the UniqueProcessId value from the AD7 Layer.

    Note that this method may only be called in response to the Visual Studio
    debugger package requesting a launch. Components that wish to launch another
    process under the debugger should send a custom event to a visual studio package.
    From a package, a launch can be requested through the
    IVsDebugger.LaunchDebugTargets API.
    </summary>
    <param name="request">
    [In] DkmProcessLaunchRequest is used to describe the process that debugger should
    launch.
    </param>
    <returns>
    [Out] DkmLaunchedProcessInfo is returned from APIs that launch a process.
    </returns>
</member>

Интерфейс, который мы переопределяем, - IDkmStartDebuggingOperations, а метод - LaunchDebuggedProcess, который в реализации примет DkmProcessLaunchRequest, то есть dispatcher object. Если реализация не хочет обрабатывать вызов, она может вызвать следующую реализацию, взяв dispatcher object и вызвав метод с тем же именем, передав ему необходимые параметры.

Например:

internal class MyStartDebuggingOperations : IDkmStartDebuggingOperations
{
    public DkmLaunchedProcessInfo LaunchDebuggedProcess(DkmProcessLaunchRequest request)
    {
        if (/* custom check that this class is to handle it */)
        {
            // Handle custom implementation here
        }
        else
        {
            // This calls the base implementation
            return request.LaunchDebuggedProcess();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...