public static TypeDefinition FindType(this ModuleDefinition moduleDefinition, string assemblyName, string typeName)
{
var cacheKey = $"{typeName}, {assemblyName}|{moduleDefinition.Name}";
if (_cachedTypeDefinitions.ContainsKey(cacheKey))
{
return _cachedTypeDefinitions[cacheKey];
}
var resolvedAssembly = moduleDefinition.ResolveAssembly(assemblyName);
if (resolvedAssembly == null)
{
return null;
}
foreach (var module in resolvedAssembly.Modules)
{
var allTypes = module.GetAllTypeDefinitions().OrderBy(x => x.FullName);
var type = (from typeDefinition in allTypes
where typeDefinition.FullName == typeName
select typeDefinition).FirstOrDefault();
if (type == null)
{
type = (from typeDefinition in allTypes
where typeDefinition.Name == typeName
select typeDefinition).FirstOrDefault();
}
if (type != null)
{
_cachedTypeDefinitions[cacheKey] = type;
return type;
}
}
return null;
}