2009-10-17 117 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