2009-10-17 75 views
6
中使用的程序集的路径

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

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/path/filepath属性。要获得位置属性,我首先使用Assembly.Load(),然后使用位置属性。我不想加载程序集来获取它们的路径,因为它们没有必要使用,并且因为Assembly.Load()可能会因FileNotFoundException或BadImageFormatException而失败。

回答

9

我想我通过将其替换为Assembly.ReflectionOnlyLoad()解决了Assembly.Load()问题。

现在这是我的方法是如何的样子:

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(),我如何得到引用的程序从类型,而不是从组件?

+0

所有类型都属于程序集 - 你应该只能做type.Assembly.GetReferencedAssemblies()。哦,等等,你已经这么做了。我假设无论如何这已经很久了,对吧? 2011? – 2013-04-10 19:42:32

+0

@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。 – Kiquenet 2014-03-28 11:02:29

+0

要使用,请调用'var results = this.GetType()。GetReferencesAssembliesPaths();'。 – Contango 2014-10-10 11:12:23

2

type.Assembly.GetReferencedAssemblies()将返回声明该类型的程序集引用的所有程序集。这并不是说你用这个函数得到的程序集与给定的类型有任何共同之处。

+0

是的,这正是我用这种方法遇到的问题之一。 – DxCK 2009-10-18 21:17:29

+0

问题:一个库项目引用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。 – Kiquenet 2014-03-28 11:03:02