Как мне получить 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;
    }
}               

                         
→ Ссылка