Как мне получить Assembly по названию проекта?
Моя задача: вытащить из проекта все классы, имена которых содержат "API". Еще известно, что такие классы будут лежать в проектах, имена которых, содержат "Abstractions"
Я сделал следующее:
private List<string> GetProjectsNamesInSolution()
{
var solutionFile = SolutionFile
.Parse( @"..\.sln" );
var projects = solutionFile.ProjectsInOrder
.OrderBy( x => x.ProjectName )
.Where( x => x.ProjectName
.ToLowerInvariant()
.Contains( "abstractions" ) )
.Select( x => x.ProjectName )
.ToList();
return projects;
}
Таким образом, я получил все имена проектов. Как мне теперь взять все нужные классы из этих проектов?
я попробовал так
var assemblies = projectsNames
.Select( projectName => Assembly.Load( projectName ) );
но, к сожалению, не все ассембли загружаются
Ответы (1 шт):
Автор решения: penancewarrior
→ Ссылка
ну у меня как-то так получилось
public class GetClassFields
{
private const string BasePath
= @"C:\Desktop\dotnet\";
private const string NetStandardPath
= @"\bin\Debug\netstandard2.0\win-x64\";
private const string Net6Path
= @"\bin\Debug\net6.0\win-x64\";
static public IEnumerable<Type> GetClasses()
=> GetAssemblies()
.SelectMany( GetTypesWithHelpAttribute );
static IEnumerable<Type> GetTypesWithHelpAttribute( Assembly assembly )
=> assembly
.GetTypes()
.Where(type => type
.GetCustomAttributes( typeof(ApiEventsAttribute), true)
.Length > 0);
static private IEnumerable<Assembly> GetAssemblies()
{
var assemblies = new List<Assembly>();
ProjectsNamesInSolution()
.ForEach( projectName =>
{
var net6Path = $"{BasePath}{projectName}{Net6Path}{projectName}.dll";
var netstandardPath = $"{BasePath}{projectName}{NetStandardPath}{projectName}.dll";
match( LoadAssembly( netstandardPath ),
Succ: assembly => assemblies.Add( assembly ),
Fail: _ => assemblies.Add( Assembly.LoadFrom( net6Path ) ) );
} );
return assemblies;
}
static private Try<Assembly> LoadAssembly( string path )
=> () => Assembly.LoadFrom( path );
static private List<string> ProjectsNamesInSolution()
{
var solutionFile = SolutionFile
.Parse( @".sln" );
var projects = solutionFile.ProjectsInOrder
.OrderBy( x => x.ProjectName )
.Where( x => x.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat)
.Where( x => x.ProjectName
.ToLowerInvariant()
.Contains( "abstractions" ) )
.Select( x => x.ProjectName )
.ToList();
return projects;
}
}