使用 C# 扫描所有程序集时,有没有办法识别我的自定义程序集?

Is there a way to identify my custom assemblies when scanning all assemblies using c#?

我有一个包含多个项目的应用程序。当然,每个项目都会创建自己的 dll。然后我们可以使用 AppDomain.CurrentDomain.GetAssemblies().ToList() 让所有程序集都使用反射,原因有很多。

AppDomain.CurrentDomain.GetAssemblies() 将扫描每个存在的程序集,包括像 Microsoft 的标准程序集或我们使用其他依赖管理工具的 Nuget 提取的程序包。如果我只想扫描我的项目 dll 而不是其他项目怎么办?

有没有办法为我的项目提供共享类型,然后查找该共享类型?不幸的是,我的项目没有通用名称架构来扫描名称以查找以此处开头或以此处结尾的内容。

您可以使用 built-in 程序集属性之一,例如 CompanyName。将此属性添加到您的程序集(或编辑,通常它已经添加到 AssemblyInfo.cs 文件中):

[assembly: AssemblyCompany("My company")]

然后检查公司名称是否匹配:

static bool IsMyAssembly(Assembly asm) {
    var company = asm.GetCustomAttribute<AssemblyCompanyAttribute>();
    return company != null && company.Company == "My company";
}

您可以使用以下方法过滤 GAC 程序集:

AppDomain.CurrentDomain.GetAssemblies().Where(a => !a.GlobalAssemblyCache)

您可以为每个程序集添加自定义属性并对其进行查询:

AppDomain.CurrentDomain.GetAssemblies()
    .Select(a => a.GetCustomAttribute<MyAttribute>()).Where(attr => attr != null && attr.CustomProp == "MyValue")