2009-10-17 5 views
6

Typeを受け取り、その型で使用されているすべてのアセンブリのパスを返すメソッドが必要です。 私がこれを書いた: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プロパティはありません。 locationプロパティを取得するには、まずAssembly.Load()を使用してからlocationプロパティを使用しました。 Assembly.Load()はFileNotFoundExceptionまたはBadImageFormatExceptionで失敗する可能性があるため、アセンブリをロードする必要はありません。

答えて

9

私は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()である:

は今、これは私の方法がどのように見えるかですか?

+0

すべての型はアセンブリに属します。つまり、type.Assembly.GetReferencedAssemblies()を実行できるだけです。ああ待って、あなたはすでにそれをやっている。とにかくこれは長い間解決されていると思いますよね? 2011年? –

+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

+0

使用するには、 'var results = this.GetType()。GetReferencesAssembliesPaths();'を呼び出します。 – Contango

2

type.Assembly.GetReferencedAssemblies()は、型が宣言されているアセンブリで参照されているアセンブリをすべて返します。これは、この関数を使用するアセンブリが、指定された型と共通のものを持つことを意味しません。

+0

はい、これはまさにその方法の私の問題の1つです。 – DxCK

+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

関連する問題