using System.IO.Compression;
using System.Threading.Tasks;
using ICSharpCode.Decompiler.Metadata;
using ICSharpCode.Decompiler.TypeSystem;
using NuGet.Protocol.Core.Types;
using NuGetRepository = NuGet.Protocol.Core.Types.Repository;
const string dllName = "Avalonia.Base.dll";
var peFile = await GetPEFileAsync();
var resolver = new UniversalAssemblyResolver(dllName, throwOnError: false, targetFramework: "netcoreapp2.0");
var typeSystem = new DecompilerTypeSystem(peFile, resolver);
var typeDef = typeSystem.MainModule.GetTypeDefinition(new TopLevelTypeName("Avalonia.Input.Raw.RawPointerPoint"));
var constructors = typeDef.GetConstructors().ToArray();
foreach (var constructor in constructors)
Type = constructor.GetType().FullName,
constructor.ReflectionName,
ParameterCount = constructor.Parameters.Count
static async Task<PEFile> GetPEFileAsync()
var repo = NuGetRepository.Factory.GetCoreV3("https://api.nuget.org/v3/index.json");
var resource = await repo.GetResourceAsync<FindPackageByIdResource>().ConfigureAwait(false);
using var packageStream = new MemoryStream();
await resource.CopyNupkgToStreamAsync(
new NuGetVersion(11, 0, 0, "preview5"),
NullSourceCacheContext.Instance,
using var archive = new ZipArchive(packageStream, ZipArchiveMode.Read);
var dllEntry = archive.GetEntry($"lib/netcoreapp2.0/{dllName}");
var compressedStream = dllEntry!.Open();
using var decompressedStream = new MemoryStream();
await compressedStream.CopyToAsync(decompressedStream);
await compressedStream.FlushAsync();
decompressedStream.Position = 0;
var peFile = new PEFile(dllName, decompressedStream);