2009-07-17 13 views

Odpowiedz

36

Assembly.GetAssembly zakłada masz instancję typu i Type.GetType zakłada masz pełną nazwę typu który zawiera nazwę zestawu.

Jeśli masz tylko nazwę typu podstawa, trzeba zrobić coś więcej tak:

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

ta zakłada również Twój typ jest zadeklarowany w korzeniu. Będziesz musiał podać przestrzeń nazw lub otaczające typy w nazwie lub powtórzyć iterację w ten sam sposób.

+0

Prawdopodobnie rzuciłbym ArgumentException w przypadku, gdyby nie mógł znaleźć tego, czego szukasz. Przypuszczalnie byłby to wyjątkowy przypadek, a następnie możesz założyć, że go znalazłeś (lub umieścić kod obsługi błędów w oświadczeniu catch). –

+0

ALE, Assembly.GetAssembly nie potrzebuje instancji typu, potrzebuje tylko typu, więc jeśli szukasz czegoś, co znasz typ podczas kompilacji, możesz użyć typeof (Type) jak w moim pierwszym przykładzie. –

+0

Dzięki za odpowiedzi, działa to dla mnie jak urok. Nie miałem typu, tylko nazwa typu i wiem, że dostępne było odwołanie do zawierającego go zestawu. –

1
Type.GetType(typeNameString).Assembly 
+1

Ta metoda oczekuje nazwy kwalifikowanej do zestawu. Czy na pewno działa on w trybie cross-assembly, jeśli nie kwalifikujesz go przy użyciu nazwy zespołu? – chakrit

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

Wymień System.Int32 z dowolnego typu zdarzy ci się potrzebne. Ponieważ przyjmuje parametr Type, można zrobić prawie wszystko w ten sposób, na przykład:

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

Jako sidenote, używam tej funkcji jako sposobu zapełniania listy ReferencedAssembly podczas używania CSharpCodeProvider do kompilacji C# dynamicznie. –

+1

To przydatna wskazówka, ale oryginalny plakat ma tylko nazwę typu, a nie typ. –

-1

Jeżeli możesz go używać, to składnia jest najkrótsza/najczystsze:

typeof(int).Assembly 
+1

Czy przeczytałeś nawet pytanie do OP przed opublikowaniem ogólnej odpowiedzi? OP nie ma typu i tylko nazwa ciągu. Ta odpowiedź całkowicie ignoruje ten fakt. –

+0

@JoshuaHayes Robisz tyle samo założeń co ja. Pisząc moją ogólną odpowiedź, zacząłem od nazwy typu ('int') i napisałem wyrażenie, aby uzyskać zestaw, w którym zdefiniowano ten typ. Nie raz w tym całym wątku OP stwierdził, że ma on nazwę typu jako ciąg znaków. –

+0

Rzeczywiście to zrobił. Spójrz na sygnaturę metody (string nazwa_typu). OP powiedział, że miał tylko nazwę typu. Stąd moje odniesienie do nazwy typu łańcucha. –

2

Mam dostosowany przyjętej odpowiedź dla moich własnych celów (powrót obiekt montażową zamiast nazwy zespołu) i refactored kod dla VB.NET i LINQ:

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

jestem po prostu dzielenie go tutaj jeśli ktoś chciałby rozwiązanie LINQy z przyjętymi odpowiedź.