Как обнаружить экземпляры определенного класса с помощью Сесила?

Мне было поручено проанализировать скомпилированный двоичный файл.NET и найти все методы, которые создают определенный класс в своем теле. Этот объект не является параметром метода, а является внутренней переменной, которая распространяется только на метод. Методы помечены как асинхронные и используют await в определенных частях, но не при создании объекта.

До сих пор я могу перечислить методы в любом классе и получить их инструкции, но не могу найти, как обнаружить экземпляры моего целевого класса в теле.

Я использовал следующий код в качестве примера:

[Route("PKG_CMP_ATRIBUTO/SEL_ATRIBUTO_ORIGENDATOS")]
[HttpGet]
public async Task<OperationResult<List<CMP_ATRIBUTO>>> SEL_ATRIBUTO_ORIGENDATOS(decimal PIN_ORIGEN_DATOS_ID)
{
    OperationResult<List<CMP_ATRIBUTO>> resultado_operacion;
    try
    {
        var repo = new PKG_CMP_ATRIBUTORepository();
        var result = await repo.SEL_ATRIBUTO_ORIGENDATOS(PIN_ORIGEN_DATOS_ID);
        resultado_operacion = new OperationResult<List<CMP_ATRIBUTO>>(result);
    }
    catch (Exception ex)
    {
        resultado_operacion = new OperationResult<List<CMP_ATRIBUTO>>(ex);
    }
    return resultado_operacion;
}

и строка, которую я хочу найти, var repo = new PKG_CMP_ATRIBUTORepository();,

Декомпиляция двоичного файла с помощью ILSpy дает мне следующий IL:

.method public hidebysig 
instance class [mscorlib]System.Threading.Tasks.Task`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>> SEL_ATRIBUTO_ORIGENDATOS (
    valuetype [mscorlib]System.Decimal PIN_ORIGEN_DATOS_ID
) cil managed 
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.AsyncStateMachineAttribute::.ctor(class [mscorlib]System.Type) = (
    01 00 65 43 6f 6e 73 61 6c 75 64 2e 47 65 73 74
    6f 72 43 61 6d 70 61 6e 69 61 73 2e 57 65 62 41
    70 69 2e 43 6f 6e 74 72 6f 6c 6c 65 72 73 2e 50
    4b 47 5f 43 4d 50 5f 41 54 52 49 42 55 54 4f 43
    6f 6e 74 72 6f 6c 6c 65 72 2b 3c 53 45 4c 5f 41
    54 52 49 42 55 54 4f 5f 4f 52 49 47 45 4e 44 41
    54 4f 53 3e 64 5f 5f 30 00 00
)
.custom instance void [mscorlib]System.Diagnostics.DebuggerStepThroughAttribute::.ctor() = (
    01 00 00 00
)
.custom instance void [System.Web.Http]System.Web.Http.RouteAttribute::.ctor(string) = (
    01 00 29 50 4b 47 5f 43 4d 50 5f 41 54 52 49 42
    55 54 4f 2f 53 45 4c 5f 41 54 52 49 42 55 54 4f
    5f 4f 52 49 47 45 4e 44 41 54 4f 53 00 00
)
.custom instance void [System.Web.Http]System.Web.Http.HttpGetAttribute::.ctor() = (
    01 00 00 00
)
// Method begins at RVA 0x4c8c
// Code size 66 (0x42)
.maxstack 2
.locals init (
    [0] class Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0',
    [1] valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>>
)

IL_0000: newobj instance void Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::.ctor()
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldarg.0
IL_0008: stfld class Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::'<>4__this'
IL_000d: ldloc.0
IL_000e: ldarg.1
IL_000f: stfld valuetype [mscorlib]System.Decimal Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::PIN_ORIGEN_DATOS_ID
IL_0014: ldloc.0
IL_0015: call valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<!0> valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>>::Create()
IL_001a: stfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>> Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::'<>t__builder'
IL_001f: ldloc.0
IL_0020: ldc.i4.m1
IL_0021: stfld int32 Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::'<>1__state'
IL_0026: ldloc.0
IL_0027: ldfld valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>> Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::'<>t__builder'
IL_002c: stloc.1
IL_002d: ldloca.s 1
IL_002f: ldloca.s 0
IL_0031: call instance void valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>>::Start<class Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'>(!!0&)
IL_0036: ldloc.0
IL_0037: ldflda valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>> Consalud.GestorCampanias.WebApi.Controllers.PKG_CMP_ATRIBUTOController/'<SEL_ATRIBUTO_ORIGENDATOS>d__0'::'<>t__builder'
IL_003c: call instance class [mscorlib]System.Threading.Tasks.Task`1<!0> valuetype [mscorlib]System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<class [Consalud.Helpers]Consalud.Helpers.Classes.OperationResult`1<class [mscorlib]System.Collections.Generic.List`1<class [Consalud.GestorCampanias.Domain]Consalud.GestorCampanias.Domain.Model.CMP_ATRIBUTO>>>::get_Task()
IL_0041: ret
} // end of method PKG_CMP_ATRIBUTOController::SEL_ATRIBUTO_ORIGENDATOS

и ILSpy переводит это в следующий код C#:

using Consalud.GestorCampanias.Domain.Model;
using Consalud.GestorCampanias.WebApi.Repositories;
using Consalud.Helpers.Classes;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Web.Http;

[Route("PKG_CMP_ATRIBUTO/SEL_ATRIBUTO_ORIGENDATOS")]
[HttpGet]
public async Task<OperationResult<List<CMP_ATRIBUTO>>> SEL_ATRIBUTO_ORIGENDATOS(decimal PIN_ORIGEN_DATOS_ID)
{
    try
    {
        PKG_CMP_ATRIBUTORepository repo = new PKG_CMP_ATRIBUTORepository();
        List<CMP_ATRIBUTO> result = await repo.SEL_ATRIBUTO_ORIGENDATOS(PIN_ORIGEN_DATOS_ID);
        return new OperationResult<List<CMP_ATRIBUTO>>(result);
    }
    catch (Exception ex)
    {
        return new OperationResult<List<CMP_ATRIBUTO>>(ex);
    }
}

Я вижу, что ILSpy вполне способен понять создание PKG_CMP_ATRIBUTORepository, но я не могу понять, как это сделать в моем коде.

У меня также есть правильные PDB для каждого двоичного файла в той же папке, и я попытался загрузить его с

var reader_params = new ReaderParameters
{
    AssemblyResolver = new ConsaludResolver(webapi_project_library.DirectoryName),
    ReadSymbols = true
};
using (var webapi_assembly = AssemblyDefinition.ReadAssembly(webapi_project_library.FullName, reader_params))
{
    // code to explore the assembly
}

но это не имеет значения. Я нигде не могу найти экземпляры класса PKG_CMP_ATRIBUTORepository.

Любые указатели в правильном направлении будут с благодарностью.

0 ответов

Другие вопросы по тегам