【问题标题】:Get paths of assemblies used in Type获取 Type 中使用的程序集的路径
【发布时间】:2009-10-17 15:55:06
【问题描述】:

我需要一个方法,它接受一个类型并返回该类型中使用的所有程序集的路径。 我是这样写的:

public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
{   
 yield return type.Assembly.Location;

 foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
 {
  yield return Assembly.Load(assemblyName).Location;
 }
}

通常这种方法可以完成这项工作,但也有一些缺点:

  • 我没有找到如何从类型本身获取引用的程序集/类型,所以我使用了 type.Assembly.GetReferencedAssemblies() 并获取了整个程序集的引用,而不仅仅是那些与输入。

  • type.Assembly.GetReferencedAssemblies() 返回 AssemblyName 并且没有位置/路径/文件路径属性。为了获得 location 属性,我首先使用了 Assembly.Load() ,然后使用了 location 属性。我不希望加载程序集获取它们的路径,因为它们没有必要使用,并且因为 Assembly.Load() 可能会因 FileNotFoundException 或 BadImageFormatException 而失败。

【问题讨论】:

    标签: c# .net reflection assemblies reference


    【解决方案1】:

    我认为我解决了 Assembly.Load() 问题,将其替换为 Assembly.ReflectionOnlyLoad()。

    现在这就是我的方法的样子:

    public static IEnumerable<string> GetReferencesAssembliesPaths(this Type type)
    {           
        yield return type.Assembly.Location;
    
        foreach (AssemblyName assemblyName in type.Assembly.GetReferencedAssemblies())
        {
            yield return Assembly.ReflectionOnlyLoad(assemblyName.FullName).Location;
        }
    }
    

    现在唯一剩下的问题是 type.Assembly.GetReferencedAssemblies(),我如何从类型而不是从程序集中获取引用的程序集?

    【讨论】:

    • 所有类型都属于程序集——您应该能够只执行 type.Assembly.GetReferencedAssemblies()。哦,等等,你已经在这样做了。我假设这早就解决了,对吧? 2011 年?
    • @DxCK 关于这个问题的任何解决方案?我的问题:我的库项目引用 Oracle.DataAccess 4.112.2.0,但在执行时,从 GAC Oracle.DataAccess 4.121.1.0 加载。 Assembly.GetReferencedAssemblies() 给我 Oracle.DataAccess 4.112.2.0 而不是 Oracle.DataAccess 4.121.1.0。
    • 如需使用,请致电var results = this.GetType().GetReferencesAssembliesPaths();
    【解决方案2】:

    type.Assembly.GetReferencedAssemblies() 将返回声明类型的程序集所引用的所有程序集。这并不意味着您将使用此函数获得的程序集与给定类型有任何共同之处。

    【讨论】:

    • 关于它的问题:一个库项目引用 Oracle.DataAccess 4.112.2.0,但在执行时,从 GAC Oracle.DataAccess 4.121.1.0 加载。 Assembly.GetReferencedAssemblies() 给我 Oracle.DataAccess 4.112.2.0 而不是 Oracle.DataAccess 4.121.1.0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多