В Примере цепочки методов 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();
}
}
}