Tip

2009-10-17 31 views
6

'da kullanılan derleme yollarını edinin. Type alan ve türünde kullanılan tüm derlemelerin yollarını döndüren bir yönteme ihtiyacım var.Tip

Genellikle
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; 
} 
} 

bu yöntem bir iş, ama var bazı dezavantajları: Bunu yazdım

  • Ben başvurulan derlemeler nasıl tespit etmedi/türü kendisinden tipleri, böylece Ben type.Assembly.GetReferencedAssemblies() 'ı kullandım ve yalnızca türüyle ilgili olanları değil, tüm montajın referanslarını aldım.

  • type.Assembly.GetReferencedAssemblies() AssemblyName değerini döndürür ve konum/yol/dosya yolu özelliği yoktur. Konum özelliğini almak için önce Assembly.Load() öğesini kullandım ve sonra konum özelliğini kullandım. Yolları almak için yükleme derlemelerini istemiyorum çünkü gerekli olmadıklarından ve Assembly.Load() FileNotFoundException veya BadImageFormatException ile başarısız olabilir.

cevap

9

Assembly.ReflectionOnlyLoad() yerine Assembly.Load() sorununu çözdüm. i türünden ziyade derlemesinden başvurulan meclisleri nasıl elde edersiniz,

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; 
    } 
} 

artık sadece sol sorun type.Assembly.GetReferencedAssemblies() 'dir:

şimdi bu benim yöntem benziyor nasıl?

+0

Tüm türler derleme gruplarına aittir - sadece türünü yapabilmeniz gerekir.Assembly.GetReferencedAssemblies(). Oh bekle, bunu zaten yapıyorsun. Bunun uzun süredir çözüldüğünü farz ediyorum, değil mi? 2011? –

+0

@DxCK bu sorun hakkında herhangi bir çözüm mü? Sorunum: Kitaplığım projesi Oracle.DataAccess 4.112.2.0, ancak yürütme süresinde, GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() Oracle.DataAccess 4.112.2.0 Oracle.DataAccess 4.121.1.0 değil. – Kiquenet

+0

Kullanmak için, 'var results = this.GetType(). GetReferencesAssembliesPaths();' işlevini çağırın. – Contango

2

type.Assembly.GetReferencedAssemblies() tip beyan edildiği meclis tarafından başvurulan tüm derlemeler dönecektir. Bu, bu işlevle alacağınız meclislerin, verilen türle ortak olan herhangi bir şeye sahip olduğu anlamına gelmez.

+0

evet, bu, bu yöntemle ilgili sorunlarımdan biridir. – DxCK

+0

Konuyla ilgili: a Library projesi, Oracle.DataAccess 4.112.2.0, ancak yürütme süresinde, GAC Oracle.DataAccess 4.121.1.0. Assembly.GetReferencedAssemblies() Oracle.DataAccess 4.112.2.0 Oracle.DataAccess 4.121.1.0 değil. – Kiquenet