【问题标题】:Is there a way to identify my custom assemblies when scanning all assemblies using c#?使用 c# 扫描所有程序集时,有没有办法识别我的自定义程序集?
【发布时间】:2018-03-01 15:15:47
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以完全按照你的建议去做。声明一个通用的自定义属性并将其应用于所有程序集。
  • 我会在哪里声明呢?你有例子吗?
  • 也许可以选择AssemblyInfo.CompanyName
  • 只需在新程序集中创建一个自定义属性类型,然后在所有其他程序集中引用并应用它。
  • @MikeA,如果你付给我 500 美元,我会让你知道如何search Stackoverflow for useful information 的秘密;-)

标签: c# .net vb.net reflection .net-assembly


【解决方案1】:

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

[assembly: AssemblyCompany("My company")]

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多