Как обнаружить экземпляры определенного класса с помощью Сесила?
Мне было поручено проанализировать скомпилированный двоичный файл.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.
Любые указатели в правильном направлении будут с благодарностью.