2009-07-17 8 views

cevap

36

Assembly.GetAssembly Eğer türünün bir örneği var varsayar ve Type.GetType sen tam tür adı var varsayar: Bir Type parametre kabul olduğundan, örneğin, bir şey hakkında sadece bu şekilde yapabiliriz hangi montaj adını içerir. Yalnızca temel tipi adınız varsa

, daha böyle bir şey yapmak gerekir:

public static String GetAssemblyNameContainingType(String typeName) 
{ 
    foreach (Assembly currentassembly in AppDomain.CurrentDomain.GetAssemblies()) 
    { 
     Type t = currentassembly.GetType(typeName, false, true); 
     if (t != null) {return currentassembly.FullName;} 
    } 

    return "not found"; 
} 

Bu aynı zamanda tip kök bildirildi varsayar. Ad alanına veya kapsayıcı türlere ad vermeniz veya aynı şekilde yinelemeniz gerekir. Bunu kullanmak durumunda

+0

Muhtemelen aradığınız şeyi bulamadığı durumda ArgumentException atayım. Muhtemelen bu istisnai durum olacaktır ve daha sonra onu bulduğunuzu (veya bir yakalama ifadesinde hata işleme kodunu koyduk) varsayabiliriz. –

+0

BUT, Assembly.GetAssembly türünün bir örneğine ihtiyaç duymaz, sadece türüne ihtiyaç duyar, Yani derleme zamanında türünü bildiğiniz bir şey arıyorsanız, ilk örneğimde olduğu gibi typeof (Type) kullanabilirsiniz. –

+0

Cevaplar için teşekkürler, benim için cazibe gibi çalışıyor. Türü yoktu, sadece tip adını ve bunu içeren bir derleme referansının mevcut olduğunu biliyordum. –

1
Type.GetType(typeNameString).Assembly 
+1

Bu yöntem, montaj nitelikli bir ad bekler. Derleme adıyla nitelendirilmediyseniz, çapraz derleme çalıştığından emin misiniz? – chakrit

26
Assembly.GetAssembly(typeof(System.Int32)) 

ihtiyacınız için ne olursa olsun tipi ile System.Int32 değiştirin.

string GetAssemblyLocationOfObject(object o) { 
    return Assembly.GetAssembly(o.GetType()).Location; 
} 
+0

Bir sidenote olarak, ben tam olarak C# dinamik olarak derlemek için CSharpCodeProvider kullanırken ReferencedAssemblies listesi doldurma yolu olarak bu işlevi kullanın. –

+1

Bu yararlı bir ipucudur, ancak orijinal posterin türü yalnızca Türün örneğine değil, türüne sahiptir. –

-1

, bu sözdizimi kısa/en temiz: Ben (yerine montaj adının montaj nesnesi döndüren) Kendi amaçları için kabul edilen cevabını adapte ve refactored ettik

typeof(int).Assembly 
+1

Böyle bir genel cevap göndermeden önce OP'lerin sorusunu okudunuz mu? OP'nin türü ve yalnızca dize adı yoktur. Bu cevap, bu gerçeği tamamen yok sayar. –

+0

@JoshuaHayes Yaptığım kadar çok varsayım yapıyorsun. Genel yanıtımı yazarken, yalnızca bir tür adıyla (int ') başladım ve bu türün tanımlandığı montajı almak için bir ifade yazdım. Bu iş parçacığı bir kere değil, OP bir dize olarak tip adını bulduğunu söyledi. –

+0

Aslında yaptı. Yöntem imzasına (string typeName) bakın. OP sadece tip adı olduğunu söyledi. Bu yüzden dize tipi adına referansım. –

2

VB.NET ve LINQ için kod: başkasının kabul cevaba bir LINQy çözüm istiyorsanız

Public Function GetAssemblyForType(typeName As String) As Assembly 
    Return AppDomain.CurrentDomain.GetAssemblies.FirstOrDefault(Function(a) a.GetType(typeName, False, True) IsNot Nothing) 
End Function 

onu burada paylaşıyorum.

İlgili konular