C# 在调用程序集时过滤引用的程序集

问题描述 投票:0回答:1

我有一个类库和一个位于不同目录中的解决方案。

从 classlib 中,我调用 GetCallingAssembly,它从解决方案中返回可执行文件,然后调用 CallingAssembly.GetReferencedAssemblies 返回引用,现在我想执行优化以过滤掉引用并删除所有包引用,旨在找到某种类型。

注意:我不想依赖引用的 Name 属性。

enter image description here

c# reflection .net-assembly
1个回答
0
投票

...如果您只想查找从您的

AggregateRoot
类型派生的所有已加载程序集中的所有类型,而不搜索 不可能 包含子类的程序集,那么您需要的是:

public static IEnumerable<Type> GetAllTypesDerivedFromAggregateRoot()
{
    Assembly[] asses = AppDomain.Current.GetAssemblies();

    Type typeofRoot = typeof(AggregateRoot);
    AssemblyName mustReferenceThisAssembly = typeofRoot.Assembly.GetName();

    List<Assembly> candidates = asses
        .Where( ass => ass
            .GetReferencedAssemblies()
            .Any( ra => AssemblyName.ReferenceMatches( reference: ra, definition: mustReferenceThisAssembly ) )
        )
        .ToList();

    foreach( Assembly candidate in candidates )
    {
        Type[] types = candidate.GetTypes();
        foreach( Type t in types )
        {
            if( typeofRoot.IsAssignableFrom( t ) ) yield return t;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.